diff --git a/.github/last-synced-tag b/.github/last-synced-tag index c641220244f1..650b706f3423 100644 --- a/.github/last-synced-tag +++ b/.github/last-synced-tag @@ -1 +1 @@ -v1.1.4 +v1.1.6 diff --git a/CONTEXT/PLAN-264-266-aws-export-pwa-viewport-2026-01-07.md b/CONTEXT/PLAN-264-266-aws-export-pwa-viewport-2026-01-07.md new file mode 100644 index 000000000000..f6b71f21be51 --- /dev/null +++ b/CONTEXT/PLAN-264-266-aws-export-pwa-viewport-2026-01-07.md @@ -0,0 +1,509 @@ +# Implementation Plan: AWS SDK Export Regression & PWA Viewport Locking + +**Issues:** #264 (PWA viewport scrolling), #266 (AWS SDK bundling regression) +**Date:** 2026-01-07 +**Status:** Ready for Implementation +**Supersedes:** `PLAN-264-266-pwa-menu-audio-bundling-2026-01-05.md` (audio bundling portion complete) + +--- + +## Executive Summary + +This plan addresses two regressions in the shuvcode fork: + +1. **Issue #266 (CRITICAL):** AWS SDK credential provider (`fromNodeProviderChain`) export handling was lost during upstream merge v1.1.4. Users report `TypeError: fromNodeProviderChain is not a function` when using Amazon Bedrock provider. + +2. **Issue #264 (PARTIAL):** PWA viewport scrolling on iOS is still not locked. Users can scroll past content into blank space, breaking the native app experience. + +--- + +## Issue #266: AWS SDK Bundling Export Regression + +### Problem Description + +Users are receiving the following error when attempting to use Amazon Bedrock: + +```json +{ + "name": "UnknownError", + "data": { + "message": "TypeError: fromNodeProviderChain is not a function. (In 'fromNodeProviderChain(credentialProviderOptions)', 'fromNodeProviderChain' is undefined)\n at (src/provider/provider.ts:207:29)\n at processTicksAndRejections (native:7:39)" + } +} +``` + +### Root Cause Analysis + +**Timeline of the regression:** + +| Commit | Date | Description | +|--------|------|-------------| +| `e3bb2644e` | 2025-12-29 | Added fix to handle bundled vs unbundled AWS SDK exports | +| `ce0f09dbd` | 2026-01-06 | Sync with upstream v1.1.4 **overwrote the fix** | + +**Technical explanation:** + +When shuvcode bundles packages via `Bun.build()` with `packages: "bundle"`, the export structure of `@aws-sdk/credential-providers` changes: + +- **Unbundled (upstream):** `module.fromNodeProviderChain` (direct named export) +- **Bundled (shuvcode):** `module.default.fromNodeProviderChain` (wrapped in default export) + +The fix in `e3bb2644e` handled both cases: + +```typescript +const awsSdkModule = await import(awsSdkPath) +const fromNodeProviderChain = awsSdkModule.fromNodeProviderChain ?? awsSdkModule.default?.fromNodeProviderChain +``` + +**Current broken code** (`packages/opencode/src/provider/provider.ts:200-207`): + +```typescript +const { fromNodeProviderChain } = await import(await BunProc.install("@aws-sdk/credential-providers")) +// This fails when the bundled module doesn't have a direct named export +``` + +### External References + +- AWS SDK Credential Providers documentation: https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/migrate-credential-providers.html +- AWS SDK v3 package: https://www.npmjs.com/package/@aws-sdk/credential-providers +- Bun bundler export handling: https://bun.sh/docs/bundler + +### Related Internal Commits + +```bash +# The fix commit that was overwritten +git show e3bb2644e --stat +# commit e3bb2644e3da344b114fca3f5e1de8a6f42925dc +# fix: ensure tslib is available for AWS SDK credential providers + +# The sync commit that caused the regression +git show ce0f09dbd --stat +# commit ce0f09dbd +# sync: merge upstream v1.1.4 into integration +``` + +--- + +## Issue #264: PWA Viewport Scrolling + +### Problem Description + +On iOS Safari PWA (standalone mode), the viewport can scroll past content boundaries into blank space. This breaks the native app-like experience expected in PWA mode. + +### Root Cause Analysis + +**Current implementation gaps:** + +1. `overscroll-behavior: contain` is only applied to `.session-scroll-container` inside PWA media query +2. The `html`, `body`, and `#root` elements lack proper viewport locking in PWA mode +3. iOS Safari in PWA mode may ignore some CSS properties unless `position: fixed` is used on root containers + +**Relevant existing code:** + +| File | Line | Current State | +|------|------|---------------| +| `packages/app/index.html` | 27 | Body has `overscroll-none overflow-hidden` | +| `packages/app/index.html` | 43 | Root uses `h-dvh` (correct) | +| `packages/app/src/index.css` | 109-111 | `.session-scroll-container` has `overscroll-behavior: contain` in PWA mode only | +| `packages/app/src/pages/session.tsx` | 879 | Main container has `overflow-hidden` | +| `packages/app/src/pages/session.tsx` | 962 | Scroll container class is `session-scroll-container` | + +**Additional context:** `index.html` already applies `h-dvh` on `#root` and sets the `interactive-widget=resizes-content` viewport meta tag, so adding `position: fixed`/`inset: 0` requires reconsidering the existing `min-height` rules and safe-area padding to avoid conflicting heights when the keyboard appears on iOS. Safe-area offsets are currently handled by `header[data-tauri-drag-region]` and the prompt dock, so the plan must keep a single source of truth for padding to prevent double offsets. + +Also note that `[data-slot="list-scroll"]` already defines `overscroll-behavior: contain` inside `packages/ui/src/components/list.css:76-82`, and `.overflow-y-auto` is a widely used utility. The plan should therefore target the session-specific scroll container (and any other PWA-only scroll containers we explicitly add) instead of a global utility class to avoid unintended desktop regressions. + +### External References + +**iOS Safari PWA Viewport Solutions:** + +- Stack Overflow: https://stackoverflow.com/questions/59193062/how-to-disable-scrolling-on-body-in-ios-13-safari-when-saved-as-pwa-to-the-hom +- Medium article on iOS Safari body scroll lock: https://medium.com/@stripearmy/i-fixed-a-decade-long-ios-safari-problem-0d85f76caec0 +- WebKit bug on fixed elements with overscroll: https://bugs.webkit.org/show_bug.cgi?id=206227 +- Apple Developer Forums on iOS17 PWA `position: fixed`: https://developer.apple.com/forums/thread/744327 +- iNoBounce library (reference implementation): https://github.com/lazd/iNoBounce + +**Key insight from research:** + +The most reliable solution for iOS PWA viewport locking is: + +```css +html, body { + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; + overscroll-behavior: none; +} +``` + +--- + +## Technical Specifications + +### Issue #266: AWS SDK Export Fix + +**File:** `packages/opencode/src/provider/provider.ts` +**Lines:** 197-220 (approximately) + +**Current broken code:** + +```typescript +if (!profile && !awsAccessKeyId && !awsBearerToken) return { autoload: false } + +const { fromNodeProviderChain } = await import(await BunProc.install("@aws-sdk/credential-providers")) + +// Build credential provider options (only pass profile if specified) +const credentialProviderOptions = profile ? { profile } : {} + +const providerOptions: AmazonBedrockProviderSettings = { + region: defaultRegion, + credentialProvider: fromNodeProviderChain(credentialProviderOptions), +} +``` + +**Fixed code (restore from e3bb2644e with improvements):** + +```typescript +if (!profile && !awsAccessKeyId && !awsBearerToken) return { autoload: false } + +const awsSdkPath = await BunProc.install("@aws-sdk/credential-providers") + +// Helper to load credential provider with bundled/unbundled export handling +const loadCredentialProvider = async (options: { profile?: string }) => { + const awsSdkModule = await import(awsSdkPath) + // Handle both named exports and multiple default wrappers produced by Bun. + const fromNodeProviderChain = + awsSdkModule.fromNodeProviderChain ?? + awsSdkModule.default?.fromNodeProviderChain ?? + awsSdkModule.default?.default?.fromNodeProviderChain + + if (!fromNodeProviderChain) { + throw new Error( + "AWS SDK credentials provider is missing fromNodeProviderChain export. " + + "Inspect ~/.cache/opencode/bundled for the actual module shape and adjust this helper if Bun changes its wrapper." + ) + } + return fromNodeProviderChain(options) +} + +// Build credential provider options (only pass profile if specified) +const credentialProviderOptions = profile ? { profile } : {} + +const providerOptions: AmazonBedrockProviderSettings = { + region: defaultRegion, + credentialProvider: await loadCredentialProvider(credentialProviderOptions), +} +``` + +**Note:** `BunProc.install` already installs `tslib` (see `packages/opencode/src/bun/index.ts` and `packages/opencode/test/preload.ts`). The helper above therefore surfaces clear errors rather than retrying installs; if we encounter missing helpers during manual testing we will inspect the bundled artifact under `~/.cache/opencode/bundled` for additional wrapper layers and expand the helper accordingly. + +We also intend to add a focused unit test in `packages/opencode/test/provider/amazon-bedrock.test.ts` that mocks a bundled module returning `default` or `default.default` to validate the helper covers the real-world export shapes produced by Bun. + +### Issue #264: PWA Viewport Locking CSS + +**File:** `packages/app/src/index.css` + +**Current PWA styles (lines 90-122):** + +```css +/* PWA standalone mode specific styles */ +@media (display-mode: standalone) { + :root { + --pwa-top-offset: var(--safe-area-inset-top); + --pwa-bottom-offset: var(--safe-area-inset-bottom); + } + + #root { + min-height: 100vh; + min-height: -webkit-fill-available; + min-height: 100dvh; + } + + .home-menu-button { + top: var(--safe-area-inset-top); + } + + .session-scroll-container { + overscroll-behavior: contain; + } +} +``` + +**Enhanced PWA styles (to be added/modified):** + +```css +/* PWA standalone mode specific styles */ +@media (display-mode: standalone) { + :root { + --pwa-top-offset: var(--safe-area-inset-top); + --pwa-bottom-offset: var(--safe-area-inset-bottom); + } + + /* Critical iOS viewport locking - prevents rubber-banding on html/body */ + html { + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; + overscroll-behavior: none; + } + + body { + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; + overscroll-behavior: none; + } + + #root { + position: fixed; + inset: 0; + overflow: hidden; + overscroll-behavior: none; + /* Ensure proper sizing with safe areas */ + padding-top: env(safe-area-inset-top, 0px); + padding-bottom: env(safe-area-inset-bottom, 0px); + box-sizing: border-box; + } + + .home-menu-button { + top: var(--safe-area-inset-top); + } + + /* All scrollable containers should contain overscroll */ + .session-scroll-container { + overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; + } + + /* Ensure other scroll containers also prevent bounce */ + .overflow-y-auto, + [data-slot="list-scroll"] { + overscroll-behavior: contain; + } +} + +/* Ensure header respects safe area in PWA mode */ +@media (display-mode: standalone) { + header[data-tauri-drag-region] { + padding-top: var(--safe-area-inset-top); + min-height: calc(3rem + var(--safe-area-inset-top)); + } +} +``` + +**Note on `#root` padding:** Adding `padding-top` and `padding-bottom` to `#root` in PWA mode may require adjusting internal components that already account for safe areas. Test thoroughly. + +**Alternative approach (if padding causes layout issues):** + +```css +#root { + position: fixed; + inset: 0; + overflow: hidden; + overscroll-behavior: none; + /* Remove padding, let child components handle safe areas */ +} +``` + +--- + +## Implementation Tasks + +### Milestone 1: Fix AWS SDK Export Regression (#266) + +- [x] **1.1** Open `packages/opencode/src/provider/provider.ts` +- [x] **1.2** Locate the Amazon Bedrock provider autoload section (around line 197-220) +- [x] **1.3** Introduce the `loadCredentialProvider` helper that checks named exports plus `default`/`default.default` wrappers before throwing the diagnostics error. +- [x] **1.4** Inspect the bundled artifact for `@aws-sdk/credential-providers` (e.g., `~/.cache/opencode/bundled/@aws-sdk-credential-providers.js`) to confirm the export shape and note additional wrappers if Bun changes its bundler output. +- [x] **1.5** Document that `BunProc.install` already installs `tslib`, so the helper surfaces diagnostics instead of retrying tslib installs. +- [x] **1.6** Add a targeted unit test in `packages/opencode/test/provider/amazon-bedrock.test.ts` that mocks `fromNodeProviderChain` coming from `default` / `default.default`. +- [x] **1.7** Run existing Bedrock tests: `bun test packages/opencode/test/provider/amazon-bedrock.test.ts` +- [ ] **1.8** Clear local bundled cache and verify fix: `rm -rf ~/.cache/opencode/bundled/*aws*` + +### Milestone 2: Fix PWA Viewport Scrolling (#264) + +- [x] **2.1** Open `packages/app/src/index.css` +- [x] **2.2** Locate the `@media (display-mode: standalone)` block (lines 90-122) +- [x] **2.3** Add `position: fixed`, `inset: 0`, `overflow: hidden`, and `overscroll-behavior: none` to `html`, `body`, and `#root`, then remove the conflicting `min-height` declarations so the fixed layout becomes the canonical height source. +- [x] **2.4** Apply `overscroll-behavior: contain` (plus `-webkit-overflow-scrolling: touch`) to `.session-scroll-container` and other explicitly PWA-only scroll containers; avoid global utilities like `.overflow-y-auto` and note that `[data-slot="list-scroll"]` already declares the necessary rule. +- [x] **2.5** Review safe-area padding so only one layer (header/prompt dock or `#root`) adds offsets; update documentation/comments to capture the chosen strategy before adjusting children. +- [ ] **2.6** Test on iOS Safari PWA: + - iPhone with Dynamic Island (14 Pro or newer): open the keyboard, rotate the device, and confirm no blank-space overscroll or stuck scroll positions. + - iPhone with notch (X-13): pull beyond the top/bottom of content and ensure viewport locking holds. +- [ ] **2.7** Verify Android PWA, desktop browsers, and other standalone contexts still behave normally when scrolling and dismissing the keyboard. + +### Milestone 3: Testing and Validation + +- [x] **3.1** Run full test suite: `bun turbo test` +- [ ] **3.2** Manual test: Amazon Bedrock provider with bundled binary +- [ ] **3.3** Manual test: iOS PWA viewport locking (see test steps below) +- [ ] **3.4** Manual test: Android PWA behavior (ensure no regressions) +- [ ] **3.5** Manual test: Desktop browser behavior (ensure no regressions) + +--- + +## File Changes Summary + +| File | Change Type | Description | +|------|-------------|-------------| +| `packages/opencode/src/provider/provider.ts` | MODIFY | Restore bundled/unbundled export handling for AWS SDK | +| `packages/app/src/index.css` | MODIFY | Add position:fixed and overscroll-behavior:none for PWA viewport locking | + +--- + +## Validation Criteria + +### Automated Tests + +- [x] `bun test packages/opencode/test/provider/amazon-bedrock.test.ts` passes +- [x] `bun turbo test` at repo root passes +- [ ] TypeScript compilation succeeds: `bun run type-check` + +### Manual Test: AWS SDK (#266) + +```bash +# 1. Clear bundled cache +rm -rf ~/.cache/opencode/bundled/*aws* +rm -rf ~/.cache/opencode/bundled/*credential* + +# 2. Configure Amazon Bedrock provider in opencode.json +# { +# "providers": { +# "amazon-bedrock": { +# "enabled": true +# } +# } +# } + +# 3. Launch shuvcode and select a Bedrock model +# 4. Send a test message +# 5. Verify no "fromNodeProviderChain is not a function" error + +# 6. Check logs for successful credential loading +grep -i "credentialProvider" ~/.cache/opencode/logs/*.log +``` + +### Manual Test: PWA Viewport (#264) + +**iOS Safari PWA Test:** + +1. Open https://your-shuvcode-server in iOS Safari +2. Tap Share > Add to Home Screen +3. Launch the PWA from Home Screen +4. Navigate to a session with content +5. **Test:** Try to scroll past the bottom of content into blank space +6. **Expected:** Viewport should NOT scroll past content; overscroll should be contained +7. **Test:** Try to pull down at the top of the session +8. **Expected:** No rubber-banding that exposes blank space above content +9. **Test:** Focus the prompt input so the keyboard opens, then blur it; confirm the viewport does not jump or reveal blank space and `#root` remains fixed to safe-area edges. +10. **Test:** Rotate the device (portrait <-> landscape) and ensure the fixed layout still respects the safe-area padding without double offsets (header/prompt should align with `var(--safe-area-inset-*)`). + +**Android PWA Test:** + +1. Open in Chrome > Add to Home Screen +2. Launch PWA +3. Navigate to session view +4. **Test:** Pull down gesture at top +5. **Expected:** No page refresh triggered (PullToRefresh disabled in PWA) +6. **Test:** Open the keyboard from the prompt input and verify the viewport stays locked to the content area (no overscroll above/below). + +**Desktop Browser Test:** + +1. Open in Chrome/Firefox/Safari +2. Navigate to session view +3. **Test:** Scroll behavior +4. **Expected:** Normal scrolling, no visual regressions +5. **Test:** Open and dismiss panels/modal to confirm the fixed root does not trap focus or clip portal content. + +--- + +## Rollback Plan + +If the changes cause unexpected issues: + +### AWS SDK Fix Rollback + +Revert `packages/opencode/src/provider/provider.ts` to the simple destructuring import: + +```typescript +const { fromNodeProviderChain } = await import(await BunProc.install("@aws-sdk/credential-providers")) +``` + +Note: This will re-introduce the bug for users with bundled binaries. + +### PWA CSS Rollback + +Remove the `position: fixed` rules from the PWA media query in `packages/app/src/index.css`: + +```css +@media (display-mode: standalone) { + /* Remove html, body, #root position:fixed rules */ + /* Keep only the original rules */ +} +``` + +--- + +## Known Limitations + +1. **PWA viewport fix may affect layout:** Adding `position: fixed` to `html`/`body`/`#root` supersedes the previous `min-height`/`h-dvh` strategy and may require tweaks to any component that assumes a dynamic viewport height (e.g., sticky headers or keyboard-aware containers). + +2. **AWS SDK bundling is fragile:** The bundler export handling is a workaround for Bun's bundling behavior. Future Bun updates may change export handling. + +3. **Safe area padding decisions need consolidation:** `header[data-tauri-drag-region]`, prompt dock padding, and a potential `#root` padding should share the same assumption; otherwise components may double-apply offsets. + +--- + +## Open Questions + +| Question | Status | Resolution | +|----------|--------|------------| +| Should `#root` have safe area padding? | NEEDS TESTING | Test without first; add if needed | +| Does `position: fixed` on body break any modals? | NEEDS TESTING | Modals use portal rendering, should be unaffected | +| Does keyboard resizing / orientation changes break the fixed layout? | NEEDS TESTING | Verify on iOS Safari PWA that keyboard open/close and rotations keep content locked and portals accessible | +| Should we add a JS-based scroll lock as fallback? | DEFERRED | CSS-only solution is preferred; add JS only if CSS fails | + +--- + +## References + +### Internal Files + +| File | Purpose | +|------|---------| +| `packages/opencode/src/provider/provider.ts:197-220` | Amazon Bedrock provider initialization | +| `packages/opencode/src/bun/index.ts` | Plugin bundling with Bun.build() | +| `packages/app/src/index.css:90-122` | PWA-specific CSS rules | +| `packages/app/src/pages/session.tsx:879,962` | Session view containers | +| `packages/app/src/context/platform.tsx:5-11` | `isPWA()` utility function | + +### External Git URLs + +| Repository | Purpose | +|------------|---------| +| https://github.com/aws/aws-sdk-js-v3 | AWS SDK v3 source (credential providers) | +| https://github.com/lazd/iNoBounce | Reference for iOS scroll lock techniques | +| https://github.com/sst/opencode | Upstream opencode (for comparison) | + +### Related Commits + +```bash +# AWS SDK fix that was overwritten +git show e3bb2644e --stat -p + +# Upstream sync that caused regression +git show ce0f09dbd --stat + +# Audio asset bundling fix (already complete) +git show efa405ed4 --stat +``` + +--- + +## Changelog + +| Version | Date | Changes | +|---------|------|---------| +| v1.0 | 2026-01-07 | Initial plan addressing AWS SDK regression and PWA viewport issues | diff --git a/CONTEXT/PLAN-264-266-pwa-menu-audio-bundling-2026-01-05.md b/CONTEXT/PLAN-264-266-pwa-menu-audio-bundling-2026-01-05.md deleted file mode 100644 index c36f086bd884..000000000000 --- a/CONTEXT/PLAN-264-266-pwa-menu-audio-bundling-2026-01-05.md +++ /dev/null @@ -1,462 +0,0 @@ -## Plan Overview -Address two open bugs: PWA safe-area/scroll regressions (issue #264) and plugin audio asset bundling (issue #266). This plan captures current code context, decision points from issues, external references, and a sequenced task list with validation steps. - -**Revision Note (v1):** This plan has been revised based on codebase review to address CSS selector mismatches, missing implementation details, and PWA detection gaps. - -**Revision Note (v2 - 2026-01-06):** Plan reviewed against codebase. Added explicit directory creation, single-file plugin handling, PullToRefresh refactor details, and additional audio formats. - -## Source Issues -| Issue | Title | Link | Acceptance Criteria (abridged) | -| --- | --- | --- | --- | -| #264 | fix(pwa): Menu button hidden behind Dynamic Island and viewport scrolling not locked on iOS PWA | https://github.com/Latitudes-Dev/shuvcode/issues/264 | Menu buttons visible below Dynamic Island; session viewport locked; consistent PWA behavior; no desktop regressions; works on Dynamic Island + notch devices; Android pull-to-refresh regression noted in comment. | -| #266 | Plugin bundling doesn't copy audio files (.wav) breaking opencode-notifier sounds | https://github.com/Latitudes-Dev/shuvcode/issues/266 | Bundling copies audio assets; sounds work; assets discoverable relative to bundled plugin dir; likely include other audio formats. | - -## Context Capture and Decisions -### Issue #266 (Plugin audio assets) -- Bundled plugins are built with `Bun.build()` in `packages/opencode/src/bun/index.ts`. -- Non-JS assets are copied via `copyPluginAssets()` but only for a limited extension list (no audio). -- `copyPluginAssets()` currently flattens paths via `path.basename(entry)` which drops subdirectory structure (`bun/index.ts:235`). -- `@mohak34/opencode-notifier` resolves sounds via `__dirname/../sounds/*.wav`, so flattening + missing `.wav` results in missing files after bundling. -- Bundled assets are copied to both the package bundle directory and `Global.Path.cache` for runtime resolution. -- **GAP IDENTIFIED:** Local plugin bundling in `packages/opencode/src/plugin/index.ts:25-79` (`bundleLocalPlugin()`) does NOT call any asset copy logic after bundling. -- **GAP IDENTIFIED:** Local plugin bundling only has an entry file path; asset copying needs a reliable plugin root (for `sounds/` and similar directories). - -Decisions: -- Expand `assetExtensions` to include audio formats (`.wav`, `.mp3`, `.ogg`, `.flac`, `.m4a`) AND video/font formats for future-proofing (`.mp4`, `.webm`, `.woff`, `.woff2`, `.ttf`). -- Preserve plugin directory structure when copying assets (use the relative entry path, not `basename`). -- Ensure the copy logic creates parent directories before writing nested files using `Bun.$\`mkdir -p\``. -- **CONFIRMED:** Local `file://` plugins MUST also get asset copying. Extract `copyPluginAssets()` to a shared utility at `packages/opencode/src/util/asset-copy.ts`. -- Resolve a local plugin root before copying assets (walk up from the entry file to the nearest `package.json`, fallback to `path.dirname(filePath)`). -- Copy local plugin assets into both the bundled-local output directory and `Global.Path.cache` to preserve `__dirname/..` resolution parity with npm bundles. -- Guard against unsafe paths or symlinks in asset copying (skip entries that escape `pluginDir` or are symlinks, if detectable). -- Collision risk: assets are copied into shared dirs (`bundled`, `bundled-local`, `Global.Path.cache`). Keep this for compatibility, but log when overwriting an existing asset to surface conflicts. - -### Issue #264 (PWA safe area + viewport locking) -- Home menu button is absolutely positioned at `top-0 left-0 p-2` without safe-area offset in `packages/app/src/pages/home.tsx:35-41`. -- **CRITICAL GAP:** Session header (`packages/app/src/components/session/session-header.tsx:52`) does NOT have `data-tauri-drag-region` attribute, but existing CSS rule at `index.css:109-112` targets `header[data-tauri-drag-region]`. The CSS selector does not match. -- PWA-related safe area variables are defined in `packages/app/src/index.css:8-11`. -- `isPWA()` already exists in `packages/app/src/context/platform.tsx:5-11` and can be reused. -- Mobile pages use `PullToRefresh` wrapper in `packages/app/src/pages/layout.tsx:1177-1179` which can trigger pull-to-refresh. The issue comment notes Android refresh on downward swipe. -- **GAP IDENTIFIED:** `PullToRefresh` component has no mechanism to detect PWA standalone mode. -- Session view has scroll container at `packages/app/src/pages/session.tsx:906` with class `overflow-y-auto no-scrollbar` but no `overscroll-behavior` constraint. - -Decisions: -- Use the existing `isPWA()` in `packages/app/src/context/platform.tsx` instead of adding a new utility. -- Keep PWA styling based on `@media (display-mode: standalone)` (avoid `data-pwa` attributes that would add another detection path). -- Add `.home-menu-button` and `.session-scroll-container` classes and extend existing PWA media-query rules in `index.css`. -- Add `data-tauri-drag-region` to the session header so the existing PWA safe-area rule applies. -- Keep the mobile scroll container from `PullToRefresh` but disable refresh behavior in PWA mode (add a prop or internal PWA check instead of removing the wrapper). - -## External References (for asset copy patterns) -- https://github.com/mohak34/opencode-notifier (plugin using `sounds/*.wav`) -- https://github.com/jadujoel/bun-copy-plugin (Bun build copy plugin reference) -- https://github.com/noriyotcp/esbuild-plugin-just-copy (asset copy with preserved paths) - -## Relevant Internal Files -| File | Purpose | Key Lines | -| --- | --- | --- | -| `packages/opencode/src/bun/index.ts` | npm plugin bundling | `copyPluginAssets()` at L224-253, `assetExtensions` at L226 | -| `packages/opencode/src/plugin/index.ts` | local plugin bundling | `bundleLocalPlugin()` at L25-79 (missing asset copy) | -| `packages/app/src/pages/home.tsx` | home page with menu button | Menu button at L35-41 (`top-0 left-0`) | -| `packages/app/src/components/session/session-header.tsx` | session header | Header at L52 (missing `data-tauri-drag-region`) | -| `packages/app/src/pages/session.tsx` | session view | Scroll container at L906 | -| `packages/app/src/pages/layout.tsx` | layout with PullToRefresh | PullToRefresh wrapper at L1177-1179 | -| `packages/app/src/components/pull-to-refresh.tsx` | pull-to-refresh component | Scroll container + refresh logic | -| `packages/app/src/context/platform.tsx` | platform utils | `isPWA()` at L5-11 | -| `packages/app/src/index.css` | PWA CSS rules | Safe-area vars L8-11, PWA rules L90-121 | -| `packages/app/index.html` | HTML entry | Body classes at L27 | - -## Technical Specifications - -### Plugin Asset Bundling (Issue #266) - -#### Asset Extensions (Expanded) -```ts -const ASSET_EXTENSIONS = [ - // Existing - ".html", ".css", ".json", ".txt", ".svg", ".png", ".jpg", ".gif", - // Audio (new) - ".wav", ".mp3", ".ogg", ".flac", ".m4a", ".aac", ".webm", - // Video (new - future-proofing) - ".mp4", ".webm", ".mov", - // Fonts (new - future-proofing) - ".woff", ".woff2", ".ttf", ".otf" -] -``` - -**Note:** Use `ASSET_EXTENSIONS` (uppercase) for the shared constant to distinguish from local variables. - -#### Directory Structure Preservation -**Current (broken):** -```ts -// packages/opencode/src/bun/index.ts:235 -const destPath = path.join(destDir, path.basename(entry)) // Drops directory -await Bun.write(destPath, content) // No mkdir for nested paths -``` - -**Fixed:** -```ts -const destPath = path.join(destDir, entry) // Preserve relative path -await Bun.$`mkdir -p ${path.dirname(destPath)}` // Create parent dirs -await Bun.write(destPath, content) -``` - -#### Shared Asset Copy Utility -Create `packages/opencode/src/util/asset-copy.ts`: -```ts -import path from "path" -import fs from "fs" -import { Log } from "./log" - -const log = Log.create({ service: "asset-copy" }) - -export const ASSET_EXTENSIONS = [ - ".html", ".css", ".json", ".txt", ".svg", ".png", ".jpg", ".gif", - ".wav", ".mp3", ".ogg", ".flac", ".m4a", ".aac", - ".mp4", ".webm", ".mov", - ".woff", ".woff2", ".ttf", ".otf" -] - -/** - * Copy non-JS assets from a plugin directory to target directory. - * Preserves directory structure (e.g., sounds/alerts/beep.wav). - * - * @param pluginDir - Root directory to scan for assets (must be resolved) - * @param targetDir - Destination directory - */ -export async function copyPluginAssets(pluginDir: string, targetDir: string) { - const entries = await Array.fromAsync( - new Bun.Glob("**/*").scan({ cwd: pluginDir, dot: false }) - ) - - for (const entry of entries) { - const ext = path.extname(entry).toLowerCase() - if (!ASSET_EXTENSIONS.includes(ext)) continue - - const srcPath = path.join(pluginDir, entry) - const destPath = path.join(targetDir, entry) // Preserve structure - - // Security: Skip entries that escape pluginDir via symlinks or path traversal - const realSrcPath = await fs.promises.realpath(srcPath).catch(() => null) - if (!realSrcPath || !realSrcPath.startsWith(await fs.promises.realpath(pluginDir))) { - log.warn("skipping asset outside plugin directory", { src: entry }) - continue - } - - try { - // CRITICAL: Create parent directories before writing nested files - const destDir = path.dirname(destPath) - await Bun.$`mkdir -p ${destDir}`.quiet() - - // Log if overwriting existing file - const exists = await Bun.file(destPath).exists() - if (exists) { - log.info("overwriting existing plugin asset", { dest: destPath }) - } - - const content = await Bun.file(srcPath).arrayBuffer() - await Bun.write(destPath, content) - log.info("copied plugin asset", { src: entry, dest: destPath }) - } catch (e) { - log.error("failed to copy plugin asset", { - src: srcPath, - dest: destPath, - error: (e as Error).message, - }) - } - } -} - -/** - * Resolve the root directory of a local plugin. - * Walks up from the entry file to find nearest package.json. - * Falls back to the entry file's directory for single-file plugins. - * - * @param entryFilePath - Absolute path to the plugin entry file - * @returns Resolved plugin root directory - */ -export async function resolvePluginRoot(entryFilePath: string): Promise { - let dir = path.dirname(entryFilePath) - const root = path.parse(dir).root - - while (dir !== root) { - const pkgPath = path.join(dir, "package.json") - if (await Bun.file(pkgPath).exists()) { - return dir - } - dir = path.dirname(dir) - } - - // Fallback for single-file plugins without package.json - return path.dirname(entryFilePath) -} -``` - -**Implementation Notes:** -- `pluginDir` should be resolved via `resolvePluginRoot()` for local plugins -- Security: Uses `fs.promises.realpath()` to detect symlink escapes -- Collision detection: Logs when overwriting existing assets -- Directory creation: Uses `mkdir -p` BEFORE `Bun.write()` for nested paths -- Single-file plugins: Falls back to entry file's directory when no package.json exists - -### PWA Safe Area + Viewport Locking (Issue #264) - -#### PWA Detection Utility (existing) -Use the existing helper in `packages/app/src/context/platform.tsx`: -```ts -export function isPWA(): boolean { - if (typeof window === "undefined") return false - return ( - window.matchMedia("(display-mode: standalone)").matches || - // @ts-ignore - iOS Safari specific - window.navigator.standalone === true - ) -} -``` - -#### Home Menu Button Fix -**File:** `packages/app/src/pages/home.tsx:35-41` - -**Current:** -```tsx -
-``` - -**Fixed (CSS-based for consistency):** -```tsx -
-``` - -#### Session Header Fix -**File:** `packages/app/src/components/session/session-header.tsx:52` - -**Current:** -```tsx -
-``` - -**Fixed (match existing CSS selector):** -```tsx -
-``` - -#### CSS Rules (PWA-specific) -**File:** `packages/app/src/index.css` - Extend the existing `@media (display-mode: standalone)` block: - -```css -@media (display-mode: standalone) { - /* Existing header[data-tauri-drag-region] rule remains; ensure SessionHeader has the attribute */ - .home-menu-button { - top: var(--safe-area-inset-top); - } - - .session-scroll-container { - overscroll-behavior: contain; - } -} -``` - -#### Session Scroll Container Fix -**File:** `packages/app/src/pages/session.tsx:906` - -**Current:** -```tsx -class="relative min-w-0 w-full h-full overflow-y-auto no-scrollbar" -``` - -**Fixed:** -```tsx -class="relative min-w-0 w-full h-full overflow-y-auto no-scrollbar session-scroll-container" -``` - -#### PullToRefresh Guard -**File:** `packages/app/src/pages/layout.tsx:1177-1179` - -**Current:** -```tsx -
- {props.children} -
-``` - -**Fixed (keep scroll container, disable refresh):** -```tsx -import { isPWA } from "@/context/platform" - -// In component: -const pwaMode = isPWA() - -// In render: -
- {props.children} -
-``` - -**PullToRefresh component change (`packages/app/src/components/pull-to-refresh.tsx`):** -```tsx -export function PullToRefresh(props: ParentProps<{ enabled?: boolean }>) { - // ... existing signals ... - - // Reactive enabled check - const enabled = () => props.enabled !== false - - const handleTouchStart = (e: TouchEvent) => { - if (!enabled()) return // Early return when disabled - if (isRefreshing()) return - if (!canPull()) return - // ... rest of handler - } - - const handleTouchMove = (e: TouchEvent) => { - if (!enabled()) return // Early return when disabled - if (!isPulling() || isRefreshing()) return - // ... rest of handler - } - - const handleTouchEnd = async () => { - if (!enabled()) return // Early return when disabled - if (!isPulling()) return - // ... rest of handler - } - - // Note: Touch event listeners remain attached for scroll containment - // The enabled() guard prevents refresh behavior without removing listeners -} -``` - -**Why keep listeners attached:** The scroll container behavior (`overflow-y-auto`, `contain-strict`) should remain even when refresh is disabled. Only the pull-to-refresh gesture handling is guarded. - -### API/Config/Integration Points -- API endpoints: None added/changed. -- Config: `opencode.json` plugin list remains unchanged. -- Integration points: - - `copyPluginAssets()` moved to `packages/opencode/src/util/asset-copy.ts` (shared utility). - - Called from `packages/opencode/src/bun/index.ts` for npm plugins. - - Called from `packages/opencode/src/plugin/index.ts` for local plugins (after resolving plugin root). - - Reuse `isPWA()` from `packages/app/src/context/platform.tsx` in layout. - - `PullToRefresh` accepts an `enabled` prop to keep scroll container while disabling refresh. - - PWA CSS in `packages/app/src/index.css`. - -## Option Comparison (Asset Copy Strategy) -| Option | Summary | Pros | Cons | Decision | -| --- | --- | --- | --- | --- | -| Extend existing `copyPluginAssets()` | Update extensions + preserve directory structure | Minimal change, consistent with current bundling | Still manual copy logic | **SELECTED** | -| Introduce external copy helper/plugin | Use a bundler copy plugin | Potentially reusable | Adds dependency/config | Rejected | - -## Implementation Order and Milestones - -### Milestone 1: Fix plugin audio asset bundling (#266) -- [ ] Create shared utility `packages/opencode/src/util/asset-copy.ts`: - - Export `ASSET_EXTENSIONS` constant with audio, video, font formats - - Export `copyPluginAssets(pluginDir, targetDir)` with directory preservation - - Export `resolvePluginRoot(entryFilePath)` to find nearest package.json or fallback - - Include symlink/path traversal security checks via `fs.promises.realpath()` - - Log overwrites when copying to shared target directories -- [ ] Update `packages/opencode/src/bun/index.ts`: - - Import `{ copyPluginAssets, ASSET_EXTENSIONS }` from shared utility - - Remove inline `copyPluginAssets` function and `assetExtensions` array - - Preserve existing call sites: `copyPluginAssets(mod, bundledDir)` and `copyPluginAssets(mod, Global.Path.cache)` -- [ ] Update `packages/opencode/src/plugin/index.ts` `bundleLocalPlugin()`: - - Import `{ copyPluginAssets, resolvePluginRoot }` from shared utility - - After successful `Bun.build()`, resolve plugin root: `const pluginRoot = await resolvePluginRoot(absolutePath)` - - Call `copyPluginAssets(pluginRoot, bundledDir)` for assets - - Call `copyPluginAssets(pluginRoot, Global.Path.cache)` for runtime resolution parity -- [ ] Add tests in `packages/opencode/test/asset-copy.test.ts`: - - Test audio file copying (`.wav`, `.mp3`, `.ogg`) - - Test nested directory preservation (`sounds/alerts/beep.wav` → `targetDir/sounds/alerts/beep.wav`) - - Test `resolvePluginRoot` with package.json present - - Test `resolvePluginRoot` fallback for single-file plugins (no package.json) - - Test symlink/path traversal entries are skipped - - Test overwrite logging when file already exists - -### Milestone 2: PWA safe area and viewport locking (#264) -- [ ] Reuse `isPWA()` from `packages/app/src/context/platform.tsx` in layout (no new utility file). -- [ ] Add `.home-menu-button` class to menu button in `packages/app/src/pages/home.tsx:35`. -- [ ] Add `data-tauri-drag-region` to the session header in `packages/app/src/components/session/session-header.tsx:52`. -- [ ] Add `.session-scroll-container` class to scroll container in `packages/app/src/pages/session.tsx:906`. -- [ ] Extend PWA CSS rules in `packages/app/src/index.css`: - - `.home-menu-button` top offset - - `.session-scroll-container` overscroll-behavior - - Keep existing `header[data-tauri-drag-region]` safe-area rule -- [ ] Update `packages/app/src/components/pull-to-refresh.tsx` to accept an `enabled` prop and guard refresh behavior. -- [ ] Update `packages/app/src/pages/layout.tsx` to pass `enabled={!isPWA()}` to `PullToRefresh` while preserving the scroll wrapper. -- [ ] Verify `#root`/body sizing still uses `h-dvh` and `min-height` values appropriate for iOS PWA. - -### Milestone 3: Validation and regression checks -- [ ] Run `bun test` in `packages/opencode` (new asset copy tests). -- [ ] Run `bun turbo test` at repo root for full test suite. -- [ ] Manually verify iOS PWA on Dynamic Island device (iPhone 14+). -- [ ] Manually verify iOS PWA on notch device (iPhone X-13). -- [ ] Manually verify Android PWA pull-down behavior in session view. -- [ ] Verify no desktop/browser regressions for menu placement and scrolling. -- [ ] Verify `@mohak34/opencode-notifier` sounds play correctly. - -## Validation Criteria - -### Automated -- `bun test` in `packages/opencode` passes (new asset copy tests). -- `bun turbo test` at repo root passes. -- TypeScript compilation succeeds for both `opencode` and `app` packages. - -### Manual -- `@mohak34/opencode-notifier` plays sounds after bundling with audio assets copied. -- Home and session menu buttons are fully visible below the Dynamic Island in PWA standalone mode. -- Session view does not allow scrolling past content into blank space in PWA standalone mode. -- Android PWA swipe-down does not refresh the page when scrolling back up in session view. -- Non-PWA mobile still scrolls correctly and pull-to-refresh behavior remains unchanged. -- Desktop browser shows no visual regressions in header/menu positioning. - -### Manual Test Steps -```bash -# Issue #266: Plugin asset bundling -# Clear bundled plugin cache for notifier -rm -rf ~/.cache/opencode/bundled/*mohak34* -rm -rf ~/.cache/opencode/bundled-local/* - -# Launch opencode/shuvcode and install notifier plugin -# Trigger notification events and verify sounds play - -# Verify directory structure preserved -ls -la ~/.cache/opencode/bundled/ -# Should show: mohak34-opencode-notifier.js AND sounds/ directory with .wav files -``` - -```bash -# Issue #264: PWA testing -# iOS: Add to Home Screen from Safari, launch as PWA -# - Verify menu button not obscured by Dynamic Island -# - Verify session header not obscured -# - Verify session scroll doesn't overscroll to blank space - -# Android: Add to Home Screen from Chrome, launch as PWA -# - Verify pull-down in session view doesn't trigger refresh -# -# Non-PWA mobile browser: -# - Verify session view still scrolls and pull-to-refresh behavior is unchanged -``` - -## File Changes Summary - -| File | Change Type | Description | -| --- | --- | --- | -| `packages/opencode/src/util/asset-copy.ts` | **NEW** | Shared asset copy utility: `ASSET_EXTENSIONS`, `copyPluginAssets()`, `resolvePluginRoot()` | -| `packages/opencode/src/bun/index.ts` | MODIFY | Import shared utility, remove inline `copyPluginAssets` and `assetExtensions` | -| `packages/opencode/src/plugin/index.ts` | MODIFY | Import `resolvePluginRoot`, call `copyPluginAssets()` after `bundleLocalPlugin()` | -| `packages/opencode/test/asset-copy.test.ts` | **NEW** | Tests for asset copying, directory preservation, plugin root resolution, security | -| `packages/app/src/pages/home.tsx` | MODIFY | Add `.home-menu-button` class | -| `packages/app/src/components/session/session-header.tsx` | MODIFY | Add `data-tauri-drag-region` attribute | -| `packages/app/src/pages/session.tsx` | MODIFY | Add `.session-scroll-container` class | -| `packages/app/src/components/pull-to-refresh.tsx` | MODIFY | Add `enabled` prop, guard touch handlers with early returns | -| `packages/app/src/pages/layout.tsx` | MODIFY | Import `isPWA`, pass `enabled={!isPWA()}` to `PullToRefresh` | -| `packages/app/src/index.css` | MODIFY | Extend PWA-specific CSS rules | - -## Resolved Questions - -| Question | Resolution | -| --- | --- | -| Should audio formats beyond `.wav` be included? | YES - Include `.wav`, `.mp3`, `.ogg`, `.flac`, `.m4a`, `.aac` plus video/font formats | -| Should local `file://` plugins get asset copying? | YES - Share `copyPluginAssets()` between `bun/index.ts` and `plugin/index.ts`, copying from resolved plugin root into `bundled-local` and `Global.Path.cache` | -| How to find plugin root for local plugins? | Walk up from entry file to nearest `package.json`. Fallback to `path.dirname(entryFilePath)` for single-file plugins without package.json | -| PWA styling: inline styles vs CSS utilities? | CSS with `@media (display-mode: standalone)` for maintainability | -| How to detect PWA mode in components? | Reuse existing `isPWA()` from `packages/app/src/context/platform.tsx` | -| Should PullToRefresh keep scroll container when disabled? | YES - Only guard refresh gesture, keep scroll containment for consistent UX | diff --git a/CONTEXT/PLAN-268-askquestion-dialog-fix-2026-01-05.md b/CONTEXT/PLAN-268-askquestion-dialog-fix-2026-01-05.md deleted file mode 100644 index 75991099b3bd..000000000000 --- a/CONTEXT/PLAN-268-askquestion-dialog-fix-2026-01-05.md +++ /dev/null @@ -1,573 +0,0 @@ -# Plan: AskQuestion Tool Dialog Fix - -**Issue:** [#268 - AskQuestion tool: Dialog not appearing in Web or TUI mode](https://github.com/Latitudes-Dev/shuvcode/issues/268) - -**Created:** 2026-01-05 - -**Revised:** 2026-01-06 - Added callID validation, sync confirmation recommendations, detection helper extraction - -**Severity:** High - This breaks the core UX of the experimental askquestion feature. - -**Status:** READY TO IMPLEMENT - ---- - -## Overview - -The `askquestion` tool is invoked by the LLM, but the expected wizard dialog does not appear in either Web or TUI mode. The user cannot respond to clarifying questions, causing the tool to hang indefinitely. - -### Configuration Required - -```yaml -# .opencode/config.yaml -experimental: - askquestion_tool: true -``` - ---- - -## Acceptance Criteria - -- [ ] Wizard dialog appears when LLM invokes `askquestion` in **Web mode** -- [ ] Wizard dialog appears when LLM invokes `askquestion` in **TUI mode** -- [ ] User can submit answers via the wizard -- [ ] User can cancel the wizard with Escape -- [ ] Tool resumes correctly after user response -- [ ] Comprehensive end-to-end tests exist proving the full flow works - ---- - -## Architecture Reference - -### Component Map - -| Layer | File | Purpose | -|-------|------|---------| -| Tool Definition | `packages/opencode/src/tool/askquestion.ts` | Defines tool schema, registers pending request, awaits response | -| State Management | `packages/opencode/src/askquestion/index.ts` | `register()`, `respond()`, `cancel()`, `cleanup()` functions | -| Server Endpoints | `packages/opencode/src/server/server.ts:1694-1763` | `POST /askquestion/respond` and `/askquestion/cancel` | -| Web App Detection | `packages/app/src/pages/session.tsx:240-288` | `pendingAskQuestion` memo + handlers | -| Web App UI | `packages/app/src/components/askquestion-wizard.tsx` | `AskQuestionWizard` Solid.js component | -| Web App Rendering | `packages/app/src/pages/session.tsx:993-1010` | Conditional render of wizard vs prompt input | -| TUI Detection | `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx:391-418` | `pendingAskQuestionFromSync` memo | -| TUI UI | `packages/opencode/src/cli/cmd/tui/ui/dialog-askquestion.tsx` | `DialogAskQuestion` component | -| TUI Rendering | `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx:1447-1489` | Switch/Match conditional rendering | -| Tool Context | `packages/opencode/src/session/prompt.ts:662-677` | `ctx.metadata()` implementation | -| Part Sync | `packages/opencode/src/session/index.ts:391-401` | `updatePart()` publishes `PartUpdated` event | -| Existing Tests | `packages/opencode/test/tool/askquestion.test.ts` | Core promise flow + detection logic mocks | - -### Expected Data Flow - -``` -1. LLM calls askquestion tool with questions array - └─> askquestion.ts:19-28 - -2. Tool calls await ctx.metadata({ status: "waiting", questions }) - └─> prompt.ts:662-677 -> Session.updatePart() - └─> session/index.ts:391-401 -> Bus.publish(PartUpdated) - -3. SSE delivers PartUpdated event to clients - └─> server.ts:173-209 (global event stream) - -4. Client detects pending askquestion via sync.data.part - └─> Web: session.tsx:240-268 (pendingAskQuestion memo) - └─> TUI: session/index.tsx:391-418 (pendingAskQuestionFromSync memo) - -5. Client renders wizard dialog - └─> Web: session.tsx:993-1010 (AskQuestionWizard) - └─> TUI: session/index.tsx:1448-1484 (DialogAskQuestion) - -6. User submits answers - └─> POST /askquestion/respond -> server.ts:1694-1728 - └─> AskQuestion.respond() resolves the promise - -7. Tool promise resolves, returns formatted answers to LLM - └─> askquestion.ts:46-77 -``` - ---- - -## Suspected Root Causes - -### 1. Sync/Reactivity Gap (Most Likely) - -**Hypothesis:** The `ctx.metadata()` call updates the part and publishes `PartUpdated`, but the SSE sync may not deliver the updated part state to the client before the detection logic runs. - -**Evidence:** -- `ctx.metadata()` is async and awaited (`askquestion.ts:22`) -- `Session.updatePart()` publishes to Bus, which SSE listens to -- But there's no explicit "wait for sync" mechanism - -**Location:** `packages/opencode/src/session/prompt.ts:662-677` - -**Review Finding:** The `ctx.metadata()` at `prompt.ts:665-676` does await `Session.updatePart()`, but this only ensures the local state is updated. SSE delivery to clients is asynchronous and not confirmed. - -**Mitigation Options:** -1. **Small delay after metadata update** (simplest): - ```ts - await ctx.metadata({ ... }) - await new Promise(resolve => setTimeout(resolve, 50)) // Allow SSE delivery - ``` -2. **Use dedicated Bus event** - `AskQuestion.Event.Requested` already exists at `askquestion/index.ts:44-52` but is not currently published. Clients could listen for this instead of polling part state. -3. **Polling/retry in client detection** - If first check fails, retry a few times with small delays. - -### 2. Part State Structure Mismatch - -**Hypothesis:** The detection logic expects `part.state.metadata.status === "waiting"`, but the actual synced structure may differ. - -**Evidence:** -- Tool sets: `metadata: { questions, status: "waiting" }` (`askquestion.ts:24-27`) -- Detection checks: `part.state.metadata?.status !== "waiting"` (`session.tsx:257`) -- The `ToolStateRunning` schema shows `metadata: z.record(z.string(), z.any()).optional()` (`message-v2.ts:244`) - -**Location:** `packages/opencode/src/session/message-v2.ts:239-252` - -### 3. callID Undefined - -**Hypothesis:** The `ctx.callID` may be undefined when the tool is invoked. - -**Evidence:** -- Tool uses `ctx.callID!` (non-null assertion) at `askquestion.ts:32,40` -- Tool.Context defines `callID?: string` (optional) at `tool.ts:20` - -**Location:** `packages/opencode/src/tool/askquestion.ts:32` - -**Risk Assessment (from review):** Low risk - `callID` comes from `options.toolCallId` in `prompt.ts:659` which is set by the AI SDK for all tool calls. However, defensive validation should be added. - -**Required Fix:** Add explicit validation at the start of execute(): -```ts -async execute(params, ctx) { - if (!ctx.callID) { - throw new Error("callID is required for askquestion tool") - } - // ... rest of implementation -} -``` - -### 4. Switch/Match Ordering (TUI Only) - -**Hypothesis:** If another condition matches first (e.g., permissions), the dialog won't show. - -**Evidence:** -- Current order at `session/index.tsx:1447-1509`: - 1. `pendingAskQuestionFromSync()` - DialogAskQuestion - 2. `permissions().length > 0` - PermissionPrompt - 3. `searchMode()` - SearchInput - 4. Default - Prompt - -**Assessment:** This ordering is correct (askquestion first), so unlikely to be the issue. - ---- - -## Implementation Tasks - -### Phase 0: Required Fix (Pre-Investigation) - -- [ ] **0.1** Add callID validation to `askquestion.ts` execute function - - File: `packages/opencode/src/tool/askquestion.ts:19` - - Add at start of execute(): - ```ts - if (!ctx.callID) { - throw new Error("callID is required for askquestion tool") - } - ``` - - Remove non-null assertions (`!`) at lines 32 and 40, replace with direct `ctx.callID` usage - -### Phase 1: Investigation & Debugging - -- [ ] **1.1** Add debug logging to `askquestion.ts` after `ctx.metadata()` call to verify it returns - - File: `packages/opencode/src/tool/askquestion.ts:28` - - Add: `console.log("[askquestion] metadata updated, callID:", ctx.callID)` - -- [ ] **1.2** Add debug logging to Web detection memo to see what parts are being scanned - - File: `packages/app/src/pages/session.tsx:240-268` - - Add console.log for each part checked, especially tool parts - -- [ ] **1.3** Add debug logging to TUI detection memo - - File: `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx:391-418` - - Add console.log for each part checked - -- [ ] **1.4** Verify SSE delivers the `PartUpdated` event with correct structure - - Use browser DevTools to inspect SSE events - - Check that `part.state.metadata.status === "waiting"` is present - -- [ ] **1.5** Verify `ctx.callID` is defined when `askquestion` tool executes - - File: `packages/opencode/src/session/prompt.ts:659` - - Log the `options.toolCallId` value - -### Phase 2: Fix Sync/Reactivity Issues - -Based on investigation results, one or more of these may be needed: - -- [ ] **2.1** Ensure `ctx.metadata()` properly awaits sync propagation - - File: `packages/opencode/src/session/prompt.ts:662-677` - - Current implementation awaits `Session.updatePart()` - this is correct - - Verify the async function is properly awaited before returning - -- [ ] **2.2** Add explicit sync wait after metadata update (if needed) - - File: `packages/opencode/src/tool/askquestion.ts:28` - - Option A (simple): Add 50ms delay after metadata update to allow SSE delivery - - Option B (robust): Publish `AskQuestion.Event.Requested` via Bus and have clients listen for it - - Option C (client-side): Add retry logic to client detection memos - -- [ ] **2.3** (DONE in Phase 0) callID validation added to tool execute function - -### Phase 3: Fix Detection Logic (If Needed) - -- [ ] **3.1** Verify `toolPart.callID` is available (not undefined) in detection - - File: `packages/app/src/pages/session.tsx:260` - - File: `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx:409` - -- [ ] **3.2** Verify `toolPart.state.metadata` type matches expected schema - - Ensure detection correctly extracts `{ status, questions }` from metadata - -- [ ] **3.3** Consider alternative detection using `AskQuestion.getForSession()` directly - - This would bypass sync reactivity issues - - Would require server endpoint to expose pending requests - -### Phase 4: Comprehensive Testing - -#### 4.1 Server Endpoint Integration Tests - -- [ ] **4.1.1** Create test file: `packages/opencode/test/server/askquestion.test.ts` - -```typescript -// packages/opencode/test/server/askquestion.test.ts -import { describe, expect, test, beforeEach, afterEach } from "bun:test" -import { AskQuestion } from "../../src/askquestion" -import { Server } from "../../src/server/server" -import { Instance } from "../../src/project/instance" - -describe("askquestion server endpoints", () => { - test("POST /askquestion/respond resolves pending request", async () => { - await Instance.provide({ - directory: process.cwd(), - fn: async () => { - const server = Server.create() - const callID = "test-call-123" - const sessionID = "test-session" - const messageID = "test-message" - - // Register pending request - const promise = AskQuestion.register(callID, sessionID, messageID, [ - { id: "q1", label: "Q1", question: "Pick one", options: [ - { value: "a", label: "A" }, - { value: "b", label: "B" }, - ]}, - ]) - - // Simulate client response - const res = await server.request("/askquestion/respond", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - callID, - sessionID, - answers: [{ questionId: "q1", values: ["a"] }], - }), - }) - - expect(res.status).toBe(200) - const answers = await promise - expect(answers[0].values).toEqual(["a"]) - }, - }) - }) - - test("POST /askquestion/cancel rejects pending request", async () => { - await Instance.provide({ - directory: process.cwd(), - fn: async () => { - const server = Server.create() - const callID = "test-call-456" - const sessionID = "test-session" - const messageID = "test-message" - - const promise = AskQuestion.register(callID, sessionID, messageID, [ - { id: "q1", label: "Q1", question: "Pick one", options: [ - { value: "a", label: "A" }, - ]}, - ]) - - const res = await server.request("/askquestion/cancel", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ callID, sessionID }), - }) - - expect(res.status).toBe(200) - await expect(promise).rejects.toThrow("User cancelled") - }, - }) - }) - - test("POST /askquestion/respond returns 404 for unknown callID", async () => { - await Instance.provide({ - directory: process.cwd(), - fn: async () => { - const server = Server.create() - - const res = await server.request("/askquestion/respond", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - callID: "nonexistent", - sessionID: "test-session", - answers: [], - }), - }) - - expect(res.status).toBe(500) // Will throw error internally - }, - }) - }) -}) -``` - -#### 4.2 Sync Propagation Tests - -- [ ] **4.2.1** Create test for part sync after metadata update - -```typescript -// packages/opencode/test/tool/askquestion-sync.test.ts -import { describe, expect, test } from "bun:test" -import { Session } from "../../src/session" -import { MessageV2 } from "../../src/session/message-v2" -import { Bus } from "../../src/bus" -import { Instance } from "../../src/project/instance" - -describe("AskQuestion Sync Propagation", () => { - test("metadata update publishes PartUpdated event with correct structure", async () => { - await Instance.provide({ - directory: process.cwd(), - fn: async () => { - const events: any[] = [] - const unsub = Bus.subscribe(MessageV2.Event.PartUpdated, (evt) => { - events.push(evt) - }) - - const part: MessageV2.ToolPart = { - id: "part-123", - sessionID: "session-123", - messageID: "message-123", - type: "tool", - tool: "askquestion", - callID: "call-123", - state: { - status: "running", - input: {}, - time: { start: Date.now() }, - metadata: { - status: "waiting", - questions: [{ id: "q1", label: "Q1", question: "Test?", options: [] }], - }, - }, - } - - await Session.updatePart(part) - - expect(events.length).toBe(1) - expect(events[0].part.state.metadata.status).toBe("waiting") - expect(events[0].part.state.status).toBe("running") - - unsub() - }, - }) - }) -}) -``` - -#### 4.3 Detection Logic Tests - -- [ ] **4.3.1** Add tests for detection edge cases - -```typescript -// packages/opencode/test/tool/askquestion.test.ts (extend existing) - -describe("AskQuestion Detection Edge Cases", () => { - test("detects pending when callID is present", () => { - const messages = [{ id: "m1" }] - const partsMap = { - m1: [ - { - type: "tool", - tool: "askquestion", - callID: "call-123", // Important: callID must be present - state: { - status: "running", - metadata: { status: "waiting", questions: [] }, - }, - }, - ], - } - const result = detectPending(messages, partsMap) - expect(result).not.toBeNull() - expect(result?.callID).toBe("call-123") - }) - - test("returns null when callID is undefined", () => { - const messages = [{ id: "m1" }] - const partsMap = { - m1: [ - { - type: "tool", - tool: "askquestion", - callID: undefined, // Missing callID - state: { - status: "running", - metadata: { status: "waiting", questions: [] }, - }, - }, - ], - } - const result = detectPending(messages, partsMap) - // Should this return null or handle gracefully? - expect(result?.callID).toBeUndefined() - }) - - test("ignores when part.state.status is not 'running'", () => { - const messages = [{ id: "m1" }] - const partsMap = { - m1: [ - { - type: "tool", - tool: "askquestion", - callID: "call-123", - state: { - status: "pending", // Not running - metadata: { status: "waiting", questions: [] }, - }, - }, - ], - } - const result = detectPending(messages, partsMap) - expect(result).toBeNull() - }) - - test("ignores when metadata.status is 'completed'", () => { - const messages = [{ id: "m1" }] - const partsMap = { - m1: [ - { - type: "tool", - tool: "askquestion", - callID: "call-123", - state: { - status: "running", - metadata: { status: "completed", answers: [] }, - }, - }, - ], - } - const result = detectPending(messages, partsMap) - expect(result).toBeNull() - }) -}) -``` - -#### 4.4 Session Abort Cleanup Tests - -- [ ] **4.4.1** Add test for cleanup on session abort - -```typescript -describe("AskQuestion Cleanup", () => { - test("cleanup rejects all pending requests for session", async () => { - const sessionID = "session-to-abort" - const promises = [] - - for (let i = 0; i < 3; i++) { - promises.push( - AskQuestion.register(`call-${i}`, sessionID, `msg-${i}`, []) - ) - } - - AskQuestion.cleanup(sessionID) - - for (const promise of promises) { - await expect(promise).rejects.toThrow("Session aborted") - } - }) -}) -``` - -### Phase 5: Manual Validation - -- [ ] **5.1** Test in TUI mode - - Start shuvcode in TUI - - Enable `experimental.askquestion_tool: true` - - Trigger LLM to use askquestion (e.g., "Help me choose a database") - - Verify dialog appears - - Test submit and cancel - -- [ ] **5.2** Test in Web mode - - Start shuvcode server - - Open web app - - Enable `experimental.askquestion_tool: true` - - Trigger LLM to use askquestion - - Verify wizard appears - - Test submit and cancel on desktop - - Test submit and cancel on mobile viewport - -- [ ] **5.3** Test edge cases - - Multiple questions in sequence - - Cancel mid-flow - - Session abort while question pending - - Custom text response - ---- - -## External References - -- **Solid.js Reactivity:** https://www.solidjs.com/docs/latest/api#creatememo -- **Hono SSE Streaming:** https://hono.dev/helpers/streaming#sse-stream -- **Bun Test:** https://bun.sh/docs/cli/test - ---- - -## File Modifications Summary - -| File | Action | Description | -|------|--------|-------------| -| `packages/opencode/src/tool/askquestion.ts` | Modify | Add callID validation, remove non-null assertions, add debug logging | -| `packages/opencode/src/session/prompt.ts` | Modify | Verify metadata sync (may add delay or event publish) | -| `packages/app/src/pages/session.tsx` | Modify | Add debug logging for detection (temporary) | -| `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx` | Modify | Add debug logging for detection (temporary) | -| `packages/opencode/test/server/askquestion.test.ts` | Create | Server endpoint tests | -| `packages/opencode/test/tool/askquestion.test.ts` | Modify | Add edge case tests, callID validation test | - ---- - -## Definition of Done - -1. All acceptance criteria checkboxes are checked -2. All new tests pass (`bun turbo test`) -3. TypeScript compiles without errors for both `opencode` and `app` packages -4. Manual validation passes in both TUI and Web modes -5. Debug logging is removed before merge -6. PR is reviewed and approved - ---- - -## Risks & Mitigations - -| Risk | Likelihood | Impact | Mitigation | -|------|------------|--------|------------| -| SSE timing issues in production | Medium | High | Add explicit sync confirmation mechanism | -| Breaking other tool metadata flows | Low | High | Comprehensive test coverage | -| Mobile-specific issues | Medium | Medium | Explicit mobile testing in validation | - ---- - -## Notes - -- The detection logic is duplicated between Web (`session.tsx:240-268`) and TUI (`session/index.tsx:391-418`) - consider extracting to shared utility after fix is confirmed -- The `ctx.callID!` non-null assertion is addressed in Phase 0 with explicit validation -- The tool is behind `experimental.askquestion_tool` flag, so production impact is limited to opt-in users -- The `detectPending` helper function referenced in test examples (Phase 4.3) does not exist - it represents the extracted detection logic that should be created as part of the refactor - -## Post-Fix Refactoring (Optional) - -After the fix is confirmed working, consider: -1. Extract `detectPendingAskQuestion(messages, parts)` to `packages/opencode/src/askquestion/detect.ts` -2. Share detection logic between Web and TUI -3. Publish `AskQuestion.Event.Requested` from tool for more reliable client notification diff --git a/CONTEXT/PLAN-269-tui-transparency-toggle-2026-01-06.md b/CONTEXT/PLAN-269-tui-transparency-toggle-2026-01-06.md deleted file mode 100644 index 4759d96e7bcd..000000000000 --- a/CONTEXT/PLAN-269-tui-transparency-toggle-2026-01-06.md +++ /dev/null @@ -1,244 +0,0 @@ -# Plan: TUI Transparency Toggle Fix - -**Issue:** [#269 - Transparency toggle ignored; TUI background stays transparent across themes](https://github.com/Latitudes-Dev/shuvcode/issues/269) - -**Created:** 2026-01-06 - -**Revised:** 2026-01-06 - Critical fix: Target `resolveColor` or post-resolution normalization, not just `resolveTheme`. Added fallback chain for themes with all-transparent backgrounds. - -**Status:** NEEDS REVISION BEFORE IMPLEMENTATION - -## Overview -The TUI transparency toggle currently does not restore opaque backgrounds. The fix must ensure `theme_transparent=false` renders opaque backgrounds for all built-in themes, while `theme_transparent=true` enforces transparent backgrounds. The toggle must update the runtime theme immediately, persist across restart, and keep selected list item contrast readable. - -## Critical Issue Identified in Review - -**Root Cause:** The plan's original approach is incorrect. The current `resolveTheme` at line 226-230 only forces transparency when `transparent=true`. It does NOT force opacity when `transparent=false`. - -The real issue is that themes like `lucent-orng` use `"transparent"` as a literal color value in the JSON: -```json -"background": { "dark": "transparent", "light": "transparent" } -``` - -The `resolveColor` function at `theme.tsx:180` converts `"transparent"` to `RGBA(0,0,0,0)` **BEFORE** `resolveTheme` can apply any toggle override. By the time `resolveTheme` checks `if (transparent)`, the damage is done. - -## Requirements (from issue) -- [ ] `theme_transparent=false` renders opaque backgrounds for all built-in themes. -- [ ] `theme_transparent=true` renders transparent backgrounds consistently. -- [ ] Toggling the command updates the runtime theme immediately and persists across restart. -- [ ] Selected list item contrast stays readable when transparency is off. - -## Current Code Context -### Observations -- `resolveTheme` forces `background` alpha to 0 when `transparent` is true. -- `resolveColor` maps "transparent" or "none" to RGBA(0,0,0,0) regardless of toggle state. -- `selectedForeground` uses `theme.background.a === 0` to compute selected list item text color. -- Theme state is stored in KV using `theme_transparent` and read into `store.transparent` via `useKV`. -- Built-in theme `lucent-orng` contains "transparent" values, which can produce alpha 0 even when the toggle is off. - -### Internal References -| Area | File | Notes | -| --- | --- | --- | -| Toggle command | `packages/opencode/src/cli/cmd/tui/app.tsx` | "Toggle transparency" invokes `setTransparent(!transparent())`. | -| Theme resolution | `packages/opencode/src/cli/cmd/tui/context/theme.tsx:175-238` | `resolveTheme` function - add normalization here. | -| Color resolution | `packages/opencode/src/cli/cmd/tui/context/theme.tsx:177-196` | `resolveColor` converts "transparent" to alpha=0 - DO NOT MODIFY. | -| Selected foreground | `packages/opencode/src/cli/cmd/tui/context/theme.tsx:106-121` | `selectedForeground` checks `background.a === 0` - will auto-correct after normalization. | -| Theme persistence | `packages/opencode/src/cli/cmd/tui/context/theme.tsx:294,396-398` | `kv.get("theme_transparent", false)` and `kv.set("theme_transparent", transparent)`. | -| Built-in theme | `packages/opencode/src/cli/cmd/tui/context/theme/lucent-orng.json:64-79` | Uses "transparent" values for all backgrounds except `backgroundMenu`. | - -### Configuration Values -| Key | Location | Purpose | Type | -| --- | --- | --- | --- | -| `theme_transparent` | KV store | Persist transparency toggle | boolean | -| `theme` | KV store / sync config | Active theme name | string | -| `theme_mode` | KV store | Light/dark mode | "light" or "dark" | - -## Technical Approach and Decisions -### Hypotheses to Validate -- `store.transparent` is stuck `true` due to persistence or rehydration issues. -- Theme JSON values set to "transparent" are overriding the toggle when `transparent=false`. **CONFIRMED** -- Theme recomputation is not re-running after toggling. - -### Root Cause (Confirmed) -The `resolveColor` function at `theme.tsx:180` maps `"transparent"` or `"none"` strings to `RGBA(0,0,0,0)` **regardless of the toggle state**. This happens during color resolution, before `resolveTheme` can apply the `transparent` parameter. - -### Decision (Revised) -Add a **post-resolution normalization step** that enforces opaque backgrounds when `transparent=false`: -- When `transparent=true`, backgrounds should be fully transparent (current behavior). -- When `transparent=false`, ANY background color with alpha=0 should be replaced with an opaque fallback. -- Fallback chain: `background` → `backgroundPanel` → `backgroundElement` → `backgroundMenu` → derive from `primary`. - -Rationale: The acceptance criteria requires opaque backgrounds for all built-in themes when transparency is off. The normalization must happen AFTER `resolveColor` has processed all values. - -### Option Comparison (Updated) -| Option | Summary | Pros | Cons | Decision | -| --- | --- | --- | --- | --- | -| Pass `transparent` to `resolveColor` | Make color resolution aware of toggle | Early fix | Requires threading parameter through all calls | Rejected (too invasive) | -| **Post-resolution normalization** | Add step after all colors resolved to enforce opacity | Central fix, doesn't modify resolveColor | Requires fallback color logic | **Selected** | -| Edit theme JSONs | Replace "transparent" values with opaque colors per theme | Simple to reason about per theme | Breaks custom themes and user overrides | Rejected | -| Add per-theme allowlist | Allow only specific themes to stay transparent | Fine-grained | Contradicts acceptance criteria | Rejected | - -## Technical Specifications - -### Opaque Fallback Rules -Add a normalization function called AFTER all colors are resolved but BEFORE returning the theme: - -```ts -// In theme.tsx, after resolveTheme builds the resolved object - -function normalizeBackgrounds(resolved: Partial, transparent: boolean): Partial { - if (transparent) return resolved // No normalization when transparency is on - - // Find first opaque background to use as fallback - const findOpaqueFallback = (): RGBA => { - // Fallback chain: backgroundMenu → backgroundElement → backgroundPanel → derive from primary - const candidates = [ - resolved.backgroundMenu, - resolved.backgroundElement, - resolved.backgroundPanel, - resolved.background, - ] - - for (const color of candidates) { - if (color && color.a > 0) return color - } - - // Last resort: derive dark background from primary - // Use primary at 10% luminance for dark themes, 95% for light - const primary = resolved.primary! - return RGBA.fromInts( - Math.round(primary.r * 0.1 * 255), - Math.round(primary.g * 0.1 * 255), - Math.round(primary.b * 0.1 * 255), - 255 // Fully opaque - ) - } - - const fallback = findOpaqueFallback() - - // Replace any transparent backgrounds with the fallback - const backgroundFields: (keyof ThemeColors)[] = [ - 'background', 'backgroundPanel', 'backgroundElement', 'backgroundMenu' - ] - - for (const field of backgroundFields) { - const color = resolved[field] - if (color && color.a === 0) { - resolved[field] = fallback - } - } - - return resolved -} -``` - -### Integration Point -In `resolveTheme` function (`theme.tsx:175`), call normalization AFTER resolution but BEFORE returning: - -```ts -function resolveTheme(theme: ThemeJson, mode: "dark" | "light", transparent: boolean) { - // ... existing resolution logic (lines 176-230) ... - - // NEW: Normalize backgrounds when transparency is off - const normalized = normalizeBackgrounds(resolved, transparent) - - return { - ...normalized, - _hasSelectedListItemText: hasSelectedListItemText, - thinkingOpacity, - transparent, - } as Theme -} -``` - -### Impacted Colors -These fields are normalized when alpha is 0 and `transparent=false`: -- `background` - main app background -- `backgroundPanel` - panel/sidebar backgrounds -- `backgroundElement` - element backgrounds (inputs, buttons) -- `backgroundMenu` - menu/dropdown backgrounds - -### Selected List Item Contrast -The `selectedForeground` function at `theme.tsx:106-121` checks `theme.background.a === 0` to determine contrast mode: -- After normalization, `background.a` will be `1` (opaque) when `transparent=false` -- This means selected list items will use `theme.background` as foreground (correct behavior) -- No changes needed to `selectedForeground` - it will automatically behave correctly after normalization - -### lucent-orng Theme Analysis -This theme is the primary test case. Current values: -- `background`: `"transparent"` (dark/light) → alpha=0 -- `backgroundPanel`: `"transparent"` → alpha=0 -- `backgroundElement`: `"transparent"` → alpha=0 -- `backgroundMenu`: `"darkPanelBg"` / `"lightPanelBg"` → **opaque!** (`#2a1a1599` has alpha) - -Wait, `#2a1a1599` is a hex color with alpha. Let me check: -- `#2a1a1599` = RGB(42, 26, 21) with alpha 0x99 = 153/255 ≈ 60% opacity - -So `backgroundMenu` is semi-transparent, not fully opaque. The fallback chain must handle this: -- If ALL backgrounds have alpha < 1, derive from primary as last resort - -## Implementation Plan - -### Milestone 1: Reproduce and Inspect State -- [ ] Reproduce in TUI and log `transparent()` before and after toggling. -- [ ] Verify `kv.get("theme_transparent", false)` changes and persists across restart. -- [ ] Inspect `resolveTheme` output for `background.a` with multiple themes (Night Owl, Nord, lucent-orng). -- [ ] Confirm that the theme memo re-runs on `setTransparent` by logging `store.transparent` and `values().background.a`. -- [ ] **NEW:** Verify that `lucent-orng` theme resolves to alpha=0 even when toggle is off (confirms root cause). - -### Milestone 2: Fix Theme Resolution -- [ ] Create `normalizeBackgrounds(resolved, transparent)` helper function in `theme.tsx`. -- [ ] Implement fallback chain: `backgroundMenu` → `backgroundElement` → `backgroundPanel` → derive from `primary`. -- [ ] Handle semi-transparent colors (e.g., `#2a1a1599` with alpha=0x99) - require full opacity (alpha=1) for fallback. -- [ ] Call `normalizeBackgrounds()` at the end of `resolveTheme()` before returning. -- [ ] Ensure the `theme.transparent` flag reflects the toggle state correctly. - -### Milestone 3: Contrast and Theme UX -- [ ] Re-validate `selectedForeground` behavior with opaque backgrounds. -- [ ] Verify that selected list item contrast remains readable for Night Owl, Nord, opencode, and lucent-orng themes. -- [ ] **NEW:** Test with light mode themes to ensure derived fallback works for both dark and light modes. - -### Milestone 4: Tests -- [ ] Add unit tests in `packages/opencode/test/theme.test.ts` for: - - `normalizeBackgrounds` with fully transparent theme - - `normalizeBackgrounds` with semi-transparent `backgroundMenu` - - `normalizeBackgrounds` fallback derivation from `primary` - - Full `resolveTheme` with `transparent=false` and lucent-orng fixture -- [ ] Add test for `selectedForeground` to verify readable contrast when transparency is off. - -### Milestone 5: Manual Validation -- [ ] Toggle transparency on/off in TUI and verify immediate updates. -- [ ] Switch themes (Night Owl, Nord, lucent-orng) and verify backgrounds are opaque when toggle is off. -- [ ] Restart TUI and confirm the last toggle state is restored. -- [ ] **NEW:** Test lucent-orng specifically in both dark and light modes with transparency off. - -## Validation Criteria -### Automated -- [ ] `bun test` in `packages/opencode` passes. -- [ ] Theme transparency tests cover both on and off cases. - -### Manual -- [ ] With `theme_transparent=false`, background is opaque for all built-in themes. -- [ ] With `theme_transparent=true`, background is fully transparent. -- [ ] Selected list item text remains readable when transparency is off. -- [ ] Toggle state persists after restart. - -### Suggested Commands -```bash -cd /home/shuv/repos/worktrees/shuvcode/shuvcode-dev/packages/opencode -bun test -``` - -## External References (Git URLs) -- https://github.com/tauri-apps/wry/blob/dev/examples/transparent.rs -- https://github.com/tauri-apps/tao/blob/dev/examples/transparent.rs -- https://raw.githubusercontent.com/electron/electron/main/docs/api/browser-window.md - -## Risks and Mitigations -| Risk | Impact | Mitigation | -| --- | --- | --- | -| Opaque fallback picks a poor color for transparent themes | Medium | Use fallback chain to find best available opaque color; derive from primary as last resort. | -| Derived primary fallback looks bad | Medium | Use 10% luminance of primary for dark mode, 95% for light mode to ensure sufficient contrast. | -| Fix changes behavior for custom themes | Medium | Gate fallback only when `transparent=false` and alpha is 0. Custom themes with explicit opaque colors are unaffected. | -| Contrast regressions on selected items | Medium | Add tests for `selectedForeground` and manual spot checks. The function auto-corrects based on final `background.a`. | -| Semi-transparent backgrounds (e.g., 60% alpha) not handled | Low | Require full opacity (alpha=1) for fallback eligibility; semi-transparent stays as-is or falls through to derived. | diff --git a/CONTEXT/PLAN-270-tui-bash-spinner-stop-2026-01-06.md b/CONTEXT/PLAN-270-tui-bash-spinner-stop-2026-01-06.md deleted file mode 100644 index 8654a600754b..000000000000 --- a/CONTEXT/PLAN-270-tui-bash-spinner-stop-2026-01-06.md +++ /dev/null @@ -1,166 +0,0 @@ -# Plan: TUI Bash Spinner Stops on Completion - -**Issue:** [#270 - Fix TUI tool spinner never stops after command completion](https://github.com/Latitudes-Dev/shuvcode/issues/270) - -**Created:** 2026-01-06 - -**Revised:** 2026-01-06 - Critical correction: Original hypothesis about metadata overwrites is incorrect. The guard already exists at `prompt.ts:664`. Investigation should focus on TUI reactivity chain, not metadata updates. - -**Status:** REVISED - INCORPORATES CODEBASE FINDINGS - -## Overview -The TUI Bash tool spinner continues animating after a command completes. The UI hides the spinner only when the tool part status is no longer `running`, so the plan focuses on ensuring the Bash tool part transitions to `completed` or `error` and that the TUI properly reacts to state changes. - -## Requirements (from issue) -- [ ] Spinner disappears when tool part status transitions to `completed` or `error`. -- [ ] Bash tool parts move out of `running` state once the command exits. -- [ ] No lingering spinner in transcript/history after completion. - -## Current Code Context -### Observations -- The Bash spinner uses a non-reactive constant `isRunning = props.part.state.status === "running"` in the session view; this can stay stale after updates. -- The Bash tool streams output via `ctx.metadata` asynchronously while the process is running. -- `SessionProcessor` updates tool parts to `completed` or `error` on tool-result/tool-error events. -- `ctx.metadata` in the prompt pipeline rewrites state with `status: "running"` and `time.start`. The guard checks in-memory toolcalls, but late metadata can still race with persisted updates if the entry has not been cleared yet. - -### Internal References -| Area | File | Notes | -| --- | --- | --- | -| Bash spinner state | `packages/opencode/src/cli/cmd/tui/routes/session/index.tsx:2088-2152` | `isRunning` is a non-reactive const; `Show when={isRunning}`. | -| Tool status transitions | `packages/opencode/src/session/processor.ts:171-209` | Sets tool part to `completed` on tool-result, `error` on tool-error. | -| Metadata guard + overwrite risk | `packages/opencode/src/session/prompt.ts:662-676` | Guard checks toolcalls entry; `ctx.metadata` rewrites status to `running`. | -| Bash tool execution | `packages/opencode/src/tool/bash.ts:201-217` | Streams output via `ctx.metadata` (fire-and-forget). | -| Bash tool return | `packages/opencode/src/tool/bash.ts:293-300` | Returns `{ title, metadata, output }` triggering tool-result. | -| Event definition | `packages/opencode/src/session/message-v2.ts:419-425` | Event name is `message.part.updated`. | -| Session updatePart publish | `packages/opencode/src/session/index.ts:391-399` | Publishes `MessageV2.Event.PartUpdated`. | -| TUI sync context | `packages/opencode/src/cli/cmd/tui/context/sync.tsx:112-249` | Handles `message.part.updated` events into store. | -| Spinner frames | `packages/opencode/src/cli/cmd/tui/util/spinners.ts` | Provides `getSpinnerFrame()` used by TUI. | - -## Technical Approach and Decisions -### Hypotheses to Validate - -**Hypothesis 1: tool-result not emitted** (Unlikely) -- The tool-result event is not emitted for Bash tool executions, so status never reaches `completed`. -- **Assessment:** Bash tool returns via `return { title, metadata, output }` at `bash.ts:293-300`, which should trigger tool-result in the AI SDK. - -**Hypothesis 2: non-reactive spinner state** (Likely) -- `isRunning` is a non-reactive const in the Bash component; it can remain `true` after status updates. - -**Hypothesis 3: metadata overwrites** (Possible - guard not sufficient) -- `ctx.metadata` rewrites status to `running`. The guard only checks the in-memory toolcalls entry; late metadata can still race with persisted `completed` updates. - -**Hypothesis 4: TUI reactivity gap / event delivery** (Possible) -- The completion update is emitted but not reflected in the TUI due to sync or rendering issues. -- Solid.js reactivity chain: `sync.data.part[messageID]` → component props → `isRunning` derivation -- Event name is `message.part.updated`; confirm the stream delivers it. - -**Hypothesis 5: Part lookup mismatch** (Possible) -- The TUI looks up parts by `messageID` but the spinner component receives the wrong part reference. -- Need to verify TUI part lookup matches the part being updated. - -### Decision (Revised) -Prioritize the **non-reactive spinner state** and validate ordering/race conditions: -1. Confirm `isRunning` is non-reactive in the Bash component and fix it if so. -2. Verify tool-result fires and `Session.updatePart` is called with `status: "completed"`. -3. Validate whether late `ctx.metadata` calls can regress the persisted status. -4. Verify the event stream (`message.part.updated`) reaches the TUI sync store. - -### Option Comparison (Revised) -| Option | Summary | Pros | Cons | Decision | -| --- | --- | --- | --- | --- | -| Fix Bash spinner reactivity | Make `isRunning` reactive (memo or inline check) | Directly addresses likely root cause | Requires UI change only | **Primary fix** | -| Guard against status regression | Prevent `completed`/`error` -> `running` writes | Eliminates race risk | Needs careful invariants | Secondary if race confirmed | -| Verify event delivery | Confirm `message.part.updated` events reach sync store | Confirms data path | Diagnostic only | Diagnostic step | -| Fix part lookup mismatch | Ensure spinner uses updated part instance | Resolves mismatched references | Less likely | Triage if needed | -| Add timeout-based spinner hide | Hide spinner after N seconds regardless of status | Simple workaround | Masks underlying bug | Rejected | - -## Technical Specifications -### Tool Part Status Flow -- Initial tool part state: `running`. -- Completion: `completed` with `time.end`, `metadata`, `output`. -- Failure: `error` with `time.end` and error message. - -### Bash Tool Metadata Schema -- `metadata.output`: raw output (possibly truncated). -- `metadata.description`: user-provided description. -- `metadata.exit`: process exit code (final result). - -### UI Behavior -- Spinner visible only when `props.part.state.status === "running"`. - -## Implementation Plan - -### Milestone 1: Reproduce and Trace State Transitions -- [ ] Reproduce in TUI and confirm the Bash part status after command completion (server-side). -- [ ] Inspect `Bash` component `isRunning` for reactivity; convert to `createMemo` or inline reactive check if stale. -- [ ] Add logging to `processor.ts:171-191` (tool-result case) to verify it fires for Bash tool. -- [ ] Add logging to `Session.updatePart` to confirm it's called with `status: "completed"`. -- [ ] Log when `ctx.metadata` attempts to write after completion (guarded and unguarded cases). - -### Milestone 2: Trace Event Delivery and Store Updates -- [ ] Add logging to TUI sync handler when `message.part.updated` is received. -- [ ] Add logging when `sync.data.part[messageID]` is updated in the store. -- [ ] Identify the TUI component that renders the Bash spinner and trace its props/derivations. -- [ ] Confirm the component re-renders on part status change (post `isRunning` fix). - -### Milestone 3: Fix Based on Findings -Based on investigation, the fix will be one or more of: -- [ ] Fix Bash spinner reactivity (`isRunning` as memo or inline check). -- [ ] **If metadata regression confirmed:** Prevent `completed`/`error` → `running` writes (guard in `Session.updatePart` or `ctx.metadata`). -- [ ] **If event not delivering:** Fix event stream subscription or reconnection logic. -- [ ] **If store not updating:** Fix Solid.js store update (ensure `produce` or proper setter is used). -- [ ] **If part lookup wrong:** Fix the part ID/callID matching between processor and TUI. - -### Milestone 4: Tests -- [ ] Add a session-level test to verify tool-result → part status `completed` transition. -- [ ] **If regression guard added:** Add a test that prevents `completed`/`error` → `running` status downgrade. -- [ ] Document TUI spinner verification as manual (no TUI harness today). - -### Milestone 5: Manual Validation -- [ ] Run a Bash command via the TUI and confirm the spinner stops. -- [ ] Verify at least one other tool (Write or Task) still updates correctly. -- [ ] **NEW:** Test with both short (<1s) and long (>5s) running commands. -- [ ] **NEW:** Test spinner behavior when command errors (non-zero exit). - -## Validation Criteria -### Automated -- [ ] `bun test` in `packages/opencode` passes. -- [ ] New tests cover status transitions and any regression guard (if added). - -### Manual -- [ ] Bash tool spinner disappears after command completion. -- [ ] Bash tool parts show `completed` or `error` statuses in transcript/history. -- [ ] No regressions in other tool spinners. - -### Suggested Commands -```bash -cd /home/shuv/repos/worktrees/shuvcode/shuvcode-dev/packages/opencode -bun test -``` - -## Current Findings - -Based on codebase review: - -1. **`ctx.metadata` guard exists but is not conclusive** - - Guard checks the in-memory toolcalls entry; late metadata can still race if the entry has not been cleared yet. -2. **Bash tool metadata calls are fire-and-forget** - - Streaming metadata updates (`bash.ts:201-217`) are not awaited and can arrive after completion. -3. **tool-result handler updates status when invoked** - - `processor.ts:171-188` sets status to `completed`; still verify it fires for Bash tool. - -## External References (Git URLs) -- https://github.com/sindresorhus/ora -- https://github.com/typesense/typesense/blob/e44a57004c981c8d7be7459d792a0fc971fdb05d/benchmark/src/services/typesense-process.ts -- https://github.com/vadimdemedes/pronto/blob/5e5ea6a8e38eec315542021010efd5d1efcb9e72/cli.js - -## Risks and Mitigations -| Risk | Impact | Mitigation | -| --- | --- | --- | -| Non-reactive `isRunning` is the root cause | High | Fix to reactive memo/inline check; re-test spinner behavior. | -| Metadata race causes status regression | Medium | Add regression guard and test; log ordering for confirmation. | -| Root cause is in Solid.js reactivity beyond Bash component | Medium | Use Solid.js DevTools or targeted logging to trace updates. | -| SSE disconnection causes missed updates | Medium | Check SSE reconnection logic; consider adding heartbeat verification. | -| Logging overwhelms output | Low | Gate logs behind debug flag or sample output. | -| Fix breaks other tool spinners | Medium | Add regression test for Write or Task tool and verify manually. | -| Investigation takes longer than fix | Low | Time-box investigation to 2 hours; document findings even if incomplete. | diff --git a/CONTEXT/PLAN-271-web-input-bar-bottom-padding-2026-01-06.md b/CONTEXT/PLAN-271-web-input-bar-bottom-padding-2026-01-06.md deleted file mode 100644 index a2705d3b662b..000000000000 --- a/CONTEXT/PLAN-271-web-input-bar-bottom-padding-2026-01-06.md +++ /dev/null @@ -1,259 +0,0 @@ -# Plan: Fix Web Input Bar Bottom Padding After Status Bar Removal - -**Issue:** [#271](https://github.com/Latitudes-Dev/shuvcode/issues/271) -**Created:** 2026-01-06 -**Type:** Bug Fix (CSS/Styling) -**Complexity:** Low -**Estimated Time:** 15-30 minutes - ---- - -## Problem Summary - -After removing the bottom status bar in commit `d60c9a9eb` (to adopt upstream changes where MCP/server info moved to the top header), the prompt input bar now sits flush against the bottom edge of the screen without adequate padding. This creates a cramped visual appearance and poor UX, especially on desktop. - -### Root Cause - -The `` component (32px height via `h-8` class) previously provided visual spacing at the bottom of the viewport. With its removal, no compensation was made for the lost vertical space. - -### Current State - -**File:** `packages/app/src/pages/session.tsx:984` - -```tsx -
(promptDock = el)} - class="absolute inset-x-0 bottom-0 pt-12 pb-4 md:pb-8 flex flex-col justify-center items-center z-50 px-4 md:px-0 bg-gradient-to-t from-background-stronger via-background-stronger to-transparent pointer-events-none" - style={{ "padding-bottom": "env(safe-area-inset-bottom, 0px)" }} -> -``` - -**Issues:** -1. `pb-4` (16px mobile) and `md:pb-8` (32px desktop) are insufficient now that the status bar is gone -2. The inline `style` with `env(safe-area-inset-bottom)` **overwrites** the Tailwind `pb-*` classes entirely on iOS devices -3. Desktop has no minimum padding guarantee - ---- - -## Technical Analysis - -### CSS Spacing Scale (Tailwind 4) - -| Class | Value | -|-------|-------| -| `pb-4` | 1rem (16px) | -| `pb-6` | 1.5rem (24px) | -| `pb-8` | 2rem (32px) | -| `pb-10` | 2.5rem (40px) | -| `pb-12` | 3rem (48px) | - -### Safe Area Inset Handling - -The current implementation has a flaw: using `style={{ "padding-bottom": "env(...)" }}` as an inline style **completely overrides** any Tailwind `pb-*` classes. This means: - -- On devices with no safe area (desktop, most Android), `env(safe-area-inset-bottom, 0px)` resolves to `0px`, leaving **no** bottom padding -- The Tailwind classes (`pb-4 md:pb-8`) are present but never applied due to inline style specificity - -### Best Practice Pattern - -From [Safari 15 Bottom Tab Bars article](https://samuelkraft.com/blog/safari-15-bottom-tab-bars-web) and MDN documentation, the recommended approach is to use `max()` to combine a minimum padding with the safe area inset: - -```css -padding-bottom: max(2rem, env(safe-area-inset-bottom, 0px)); -``` - -This ensures: -- Minimum 2rem (32px) padding on all devices -- Safe area inset is respected when it's larger than the minimum - ---- - -## Acceptance Criteria (from Issue) - -- [ ] Input bar has visible padding/margin from the bottom edge on desktop (minimum ~16-24px) -- [ ] Mobile safe area insets are still respected via `env(safe-area-inset-bottom)` -- [ ] The gradient background still fades correctly above the input -- [ ] Visual consistency with the previous appearance (when status bar existed) - ---- - -## Implementation Plan - -### Task 1: Update Prompt Dock Container Styling - -**File:** `packages/app/src/pages/session.tsx` -**Line:** ~984 - -#### Approach A: Use CSS `max()` Function (Recommended) - -Replace the separate `class` and `style` attributes with a combined approach using `max()`: - -```diff -
(promptDock = el)} -- class="absolute inset-x-0 bottom-0 pt-12 pb-4 md:pb-8 flex flex-col justify-center items-center z-50 px-4 md:px-0 bg-gradient-to-t from-background-stronger via-background-stronger to-transparent pointer-events-none" -- style={{ "padding-bottom": "env(safe-area-inset-bottom, 0px)" }} -+ class="absolute inset-x-0 bottom-0 pt-12 flex flex-col justify-center items-center z-50 px-4 md:px-0 bg-gradient-to-t from-background-stronger via-background-stronger to-transparent pointer-events-none" -+ style={{ "padding-bottom": "max(1.5rem, env(safe-area-inset-bottom, 0px))" }} -> -``` - -**Rationale:** -- `max(1.5rem, env(...))` ensures minimum 24px padding while respecting larger safe areas -- Removes redundant `pb-4 md:pb-8` classes that were being overridden anyway -- Single source of truth for bottom padding - -#### Approach B: Increase Tailwind Classes + Fix Style Override - -If we want to keep the Tailwind classes for responsive behavior: - -```diff -
(promptDock = el)} -- class="absolute inset-x-0 bottom-0 pt-12 pb-4 md:pb-8 flex flex-col justify-center items-center z-50 px-4 md:px-0 bg-gradient-to-t from-background-stronger via-background-stronger to-transparent pointer-events-none" -- style={{ "padding-bottom": "env(safe-area-inset-bottom, 0px)" }} -+ class="absolute inset-x-0 bottom-0 pt-12 pb-6 md:pb-10 flex flex-col justify-center items-center z-50 px-4 md:px-0 bg-gradient-to-t from-background-stronger via-background-stronger to-transparent pointer-events-none" -+ style={{ "padding-bottom": "max(var(--tw-pb), env(safe-area-inset-bottom, 0px))" }} -> -``` - -**Note:** Tailwind 4 doesn't expose `--tw-pb` directly, so Approach A is cleaner. - -#### Approach C: Use CSS Variables (as done in askquestion-wizard.tsx) - -Following the pattern in `packages/app/src/components/askquestion-wizard.tsx:336`: - -```tsx -style={{ "padding-bottom": "calc(1.5rem + var(--safe-area-inset-bottom))" }} -``` - -Where `--safe-area-inset-bottom` is defined in `packages/app/src/index.css`: - -```css -:root { - --safe-area-inset-bottom: env(safe-area-inset-bottom, 0px); -} -``` - -**Note:** This adds to the safe area rather than taking the max, which could result in excessive padding on iOS devices. - -### Recommended Solution - -**Use Approach A** with `max()` function: - -- [ ] **1.1** Edit `packages/app/src/pages/session.tsx:984` -- [ ] **1.2** Remove `pb-4 md:pb-8` from class string -- [ ] **1.3** Update style to use `max(1.5rem, env(safe-area-inset-bottom, 0px))` - -If different padding is desired for mobile vs desktop, consider: -```tsx -style={{ - "padding-bottom": window.innerWidth >= 768 - ? "max(2.5rem, env(safe-area-inset-bottom, 0px))" // Desktop: 40px min - : "max(1.5rem, env(safe-area-inset-bottom, 0px))" // Mobile: 24px min -}} -``` - -However, for simplicity and SSR compatibility, a single `max()` value is preferred. - ---- - -### Task 2: Verify Gradient Background - -- [ ] **2.1** Confirm gradient (`bg-gradient-to-t from-background-stronger via-background-stronger to-transparent`) still displays correctly with increased padding -- [ ] **2.2** Test that the gradient fades properly above the input area - -The gradient is applied to the container, not the padding, so it should adapt automatically. - ---- - -### Task 3: Test Across Viewports - -- [ ] **3.1** Test on desktop browser (Chrome/Firefox/Safari) at various widths -- [ ] **3.2** Test on mobile simulator or device (iOS Safari, Chrome Android) -- [ ] **3.3** Test in PWA mode on iOS (Dynamic Island consideration) -- [ ] **3.4** Verify safe area insets work on devices with home indicators - ---- - -### Task 4: Visual QA - -- [ ] **4.1** Compare before/after screenshots -- [ ] **4.2** Verify input bar no longer appears flush against bottom edge -- [ ] **4.3** Confirm minimum 24px visible padding on desktop -- [ ] **4.4** Ensure no excessive whitespace (keep it balanced) - ---- - -## Code References - -### Internal Files - -| File | Purpose | -|------|---------| -| `packages/app/src/pages/session.tsx:984` | Prompt dock container (target of fix) | -| `packages/app/src/pages/session.tsx:985` | Current inline style with `env()` | -| `packages/app/src/index.css:6-11` | CSS variable definitions for safe area insets | -| `packages/app/src/components/status-bar.tsx:49` | Removed StatusBar component (reference for original spacing: `h-8` = 32px) | -| `packages/app/src/components/askquestion-wizard.tsx:336` | Similar safe area handling pattern | - -### Related Commits - -| Commit | Description | -|--------|-------------| -| `d60c9a9eb` | Removed StatusBar, causing this issue | -| `90d5fc834` | Adopted upstream header pattern (context) | - -### External References - -| Resource | URL | -|----------|-----| -| Safari 15 Bottom Tab Bars (safe area patterns) | https://samuelkraft.com/blog/safari-15-bottom-tab-bars-web | -| MDN env() function | https://developer.mozilla.org/en-US/docs/Web/CSS/env | -| CSS max() function | https://developer.mozilla.org/en-US/docs/Web/CSS/max | - ---- - -## Testing Commands - -```bash -# Start development server -cd packages/app && bun dev - -# Open in browser at http://localhost:3001 -# Test at various viewport sizes - -# For iOS testing, use Safari's Responsive Design Mode -# or connect a real device via Safari Web Inspector -``` - ---- - -## Rollback Plan - -If the fix causes issues: - -1. Revert the single line change in `session.tsx:984-985` -2. Restore original classes: `pb-4 md:pb-8` -3. Restore original style: `{ "padding-bottom": "env(safe-area-inset-bottom, 0px)" }` - ---- - -## Definition of Done - -- [ ] Input bar has minimum ~24px padding from bottom edge on desktop -- [ ] Mobile safe area insets (iPhone notch/home indicator) are respected -- [ ] Gradient background fades correctly -- [ ] Visual regression testing passed -- [ ] No TypeScript errors -- [ ] Works in standard browser and PWA mode -- [ ] PR created and reviewed - ---- - -## Notes - -- This is a low-risk, single-file CSS change -- No tests required (visual/CSS change) -- Should be a quick fix once the approach is decided -- The `max()` CSS function has excellent browser support (96%+ globally) diff --git a/CONTEXT/PLAN-tauri-mobile-support-2026-01-06.md b/CONTEXT/PLAN-tauri-mobile-support-2026-01-06.md deleted file mode 100644 index f37b4403fb82..000000000000 --- a/CONTEXT/PLAN-tauri-mobile-support-2026-01-06.md +++ /dev/null @@ -1,912 +0,0 @@ -# Tauri Mobile Support Implementation Plan - -**Date:** 2026-01-06 -**Author:** Shuvcode Fork Team -**Status:** Draft -**Target:** Android & iOS native apps via Tauri v2 - -## Executive Summary - -This plan outlines the implementation of native mobile app support for the shuvcode fork using Tauri v2's mobile capabilities. The fork already has excellent PWA support with mobile-optimized components. This plan builds on that foundation to create native Android and iOS apps that provide better platform integration, offline support, and App Store/Play Store distribution. - -## Current State Analysis - -### Existing Mobile Infrastructure (PWA) - -The shuvcode fork already has significant mobile-ready infrastructure: - -| Component | Location | Purpose | -|-----------|----------|---------| -| `MobileTerminalInput` | `packages/app/src/components/mobile-terminal-input.tsx` | Hidden input bridge for mobile keyboard to terminal WebSocket | -| `PullToRefresh` | `packages/app/src/components/pull-to-refresh.tsx` | Touch gesture detection for iOS-style pull-to-refresh | -| `useKeyboardVisibility` | `packages/app/src/hooks/use-keyboard-visibility.tsx` | Visual viewport API hook for mobile keyboard detection | -| Mobile sidebar | `packages/app/src/context/layout.tsx` | `mobileSidebar` state, drawer-style navigation | -| Mobile tabs | `packages/app/src/pages/session.tsx` | Session/Review tab switcher for mobile | -| Safe area insets | `packages/app/src/index.css` | CSS variables for notch/dynamic island handling | -| PWA manifest | `packages/app/public/site.webmanifest` | Standalone display, portrait orientation | -| Service worker | `packages/app/vite.config.ts` | VitePWA with offline caching | - -### Existing Desktop Tauri Infrastructure - -The desktop Tauri app provides a solid foundation: - -| Component | Location | Purpose | -|-----------|----------|---------| -| `tauri.conf.json` | `packages/desktop/src-tauri/tauri.conf.json` | App configuration, bundle settings | -| `Cargo.toml` | `packages/desktop/src-tauri/Cargo.toml` | Rust dependencies, Tauri plugins | -| `lib.rs` | `packages/desktop/src-tauri/src/lib.rs` | Main app logic, sidecar management | -| `cli.rs` | `packages/desktop/src-tauri/src/cli.rs` | CLI installation, path resolution | -| `window_customizer.rs` | `packages/desktop/src-tauri/src/window_customizer.rs` | Pinch zoom disable (Linux only) | -| Mobile icons | `packages/desktop/src-tauri/icons/prod/android/` | Pre-generated Android mipmap icons | -| iOS icons | `packages/desktop/src-tauri/icons/prod/ios/` | Pre-generated iOS AppIcon assets | -| Platform context | `packages/app/src/context/platform.tsx` | Platform abstraction layer | -| Desktop entry | `packages/desktop/src/index.tsx` | Tauri platform implementation | - -### Key Observation: Mobile Entry Point Exists - -The codebase already includes the mobile entry point attribute: -```rust -// packages/desktop/src-tauri/src/lib.rs:193 -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { -``` - -This indicates the Rust side is partially prepared for mobile builds. - -## Technical Challenges - -### 1. Sidecar Binary Architecture - -**Current Desktop Approach:** -- Desktop app spawns a sidecar binary (`shuvcode-cli`) that runs the server -- Server listens on localhost and WebView connects to it -- Sidecar handles all agent functionality, LSP, MCP, file operations - -**Mobile Challenge:** -- iOS does not allow spawning background processes/sidecars -- Android has similar restrictions in recent versions -- Mobile apps run in sandboxed environments - -**Solution Options:** - -| Option | Pros | Cons | Recommendation | -|--------|------|------|----------------| -| **A. Remote Server** | Simple, works today | Requires network, no offline | For MVP/testing | -| **B. Embedded Rust Server** | True native, offline capable | Complex FFI, larger binary | Long-term goal | -| **C. WebAssembly Runtime** | Cross-platform, sandboxed | Performance limitations | Experimental | - -### 2. Terminal Emulation - -**Current State:** -- Uses `ghostty-web` WASM module for terminal rendering -- WebSocket connection to PTY server endpoint -- MobileTerminalInput bridges native keyboard - -**Mobile Challenge:** -- PTY server runs in sidecar (not available on mobile) -- Need alternative for shell access - -**Solution:** -- Phase 1: Connect to remote shuvcode server (existing PWA behavior) -- Phase 2: Explore terminal.js alternatives or WebSocket proxy - -### 3. File System Access - -**Current Desktop:** -- Full filesystem access via Tauri's fs plugin -- Native file/directory pickers - -**Mobile Challenge:** -- iOS: Sandboxed app container + Files app integration -- Android: Scoped storage since Android 11 - -**Solution:** -- Use Tauri's mobile-compatible plugins -- Integrate with system file providers -- In the MVP, rely on the remote server filesystem (no device-local project storage) -- Consider workspace sync via Git or cloud storage - -### 4. Server URL Resolution & Persistence - -**Current State:** -- `defaultServerUrl` is computed synchronously in `packages/app/src/app.tsx` -- Server selection and persistence live in `ServerProvider` (`packages/app/src/context/server.tsx`) -- `DialogSelectServer` already supports add/switch + health checks - -**Mobile Challenge:** -- Mobile needs a remote server URL injected before `App` renders -- Adding a separate mobile server dialog risks divergence - -**Solution:** -- Inject `window.__SHUVCODE__.serverUrl` in the mobile entry before render -- Update `defaultServerUrl` to check this value first -- Reuse `DialogSelectServer` for all server changes - -## Implementation Plan - -### Phase 1: Project Initialization & Configuration - -#### 1.1 Initialize Tauri Mobile Targets - -- [ ] Run `bun tauri android init` in `packages/desktop` -- [ ] Run `bun tauri ios init` in `packages/desktop` -- [ ] Verify generated files: - - `src-tauri/gen/android/` - Android Studio project - - `src-tauri/gen/apple/` - Xcode project - -**Files Created:** -``` -packages/desktop/src-tauri/ - gen/ - android/ - app/ - build.gradle.kts - src/main/ - AndroidManifest.xml - java/ai/shuv/desktop/ - MainActivity.kt - res/ - build.gradle.kts - settings.gradle.kts - apple/ - Shuvcode.xcodeproj/ - Shuvcode/ - Info.plist - Assets.xcassets/ -``` - -#### 1.2 Configure Mobile Identifiers - -- [ ] Update `packages/desktop/src-tauri/tauri.conf.json` with shared mobile identifiers and defaults. -- [ ] Add mobile overrides in `packages/desktop/src-tauri/tauri.android.conf.json` and `packages/desktop/src-tauri/tauri.ios.conf.json` (do not place these at repo root). -- [ ] Update `packages/desktop/src-tauri/tauri.prod.conf.json` so production identifiers and plugin config are correct for mobile (e.g., disable updater on mobile builds). - -```json -{ - "identifier": "ai.shuv.shuvcode", - "bundle": { - "iOS": { - "developmentTeam": "YOUR_TEAM_ID", - "minimumSystemVersion": "13.0" - }, - "android": { - "minSdkVersion": 24 - } - } -} -``` - -**Reference Files:** -- `packages/desktop/src-tauri/tauri.conf.json:1-43` -- `packages/desktop/src-tauri/tauri.prod.conf.json:1-33` - -#### 1.3 Configure App Icons - -- [ ] Verify existing icons in `packages/desktop/src-tauri/icons/prod/android/` -- [ ] Verify existing icons in `packages/desktop/src-tauri/icons/prod/ios/` -- [ ] Add dev variant icons for debug builds -- [ ] Run `bun tauri icon` if regeneration needed - -**Current Icon Structure:** -``` -packages/desktop/src-tauri/icons/ - prod/ - android/ - mipmap-hdpi/ - mipmap-mdpi/ - mipmap-xhdpi/ - mipmap-xxhdpi/ - mipmap-xxxhdpi/ - mipmap-anydpi-v26/ - values/ - ios/ - AppIcon-20x20@*.png - AppIcon-29x29@*.png - AppIcon-40x40@*.png - AppIcon-60x60@*.png - AppIcon-76x76@*.png - AppIcon-83.5x83.5@2x.png - AppIcon-512@2x.png -``` - -### Phase 2: Rust Mobile Adaptation - -#### 2.1 Conditional Compilation for Mobile - -- [ ] Split `run()` into `run_desktop()` and `run_mobile()` and gate all desktop-only modules/commands (sidecar, window customizer, clipboard, updater, shell/process) with `cfg(not(mobile))` so mobile builds compile cleanly. - -```rust -// packages/desktop/src-tauri/src/lib.rs - -#[cfg(not(mobile))] -mod cli; -#[cfg(not(mobile))] -mod window_customizer; - -#[cfg(not(mobile))] -use cli::{get_sidecar_path, install_cli, sync_cli}; - -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - #[cfg(mobile)] - { - // Mobile-specific initialization - run_mobile(); - } - - #[cfg(not(mobile))] - { - // Existing desktop code - run_desktop(); - } -} - -#[cfg(mobile)] -fn run_mobile() { - tauri::Builder::default() - .plugin(tauri_plugin_os::init()) - .plugin(tauri_plugin_store::Builder::new().build()) - .plugin(tauri_plugin_dialog::init()) - .plugin(tauri_plugin_opener::init()) - .plugin(tauri_plugin_http::init()) - .plugin(tauri_plugin_notification::init()) - // Note: shell plugin limited on mobile - // Note: window-state not needed on mobile - // Note: updater works differently on mobile (app stores) - .invoke_handler(tauri::generate_handler![ - // Mobile-safe commands only - ]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} -``` - -**Reference Files:** -- `packages/desktop/src-tauri/src/lib.rs:193-330` - -#### 2.2 Update Cargo.toml for Mobile - -- [ ] Add mobile-specific dependencies: - -```toml -# packages/desktop/src-tauri/Cargo.toml - -[target.'cfg(any(target_os = "android", target_os = "ios"))'.dependencies] -# Mobile-specific deps -log = "0.4" - -[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] -# Desktop-only deps -gtk = "0.18.2" -webkit2gtk = "=2.0.1" -listeners = "0.3" - -[dependencies] -# Common deps - verify mobile compatibility -tauri = { version = "2", features = ["macos-private-api", "devtools"] } -# Note: Remove features not available on mobile -``` - -- [ ] Remove/conditionally compile desktop-only plugins: - - `tauri-plugin-updater` - App store handles updates on mobile - - `tauri-plugin-window-state` - Not applicable to mobile - - `tauri-plugin-clipboard-manager` - Requires mobile permissions -- [ ] Update `packages/desktop/src-tauri/tauri.prod.conf.json` to ensure updater config remains desktop-only and does not affect mobile builds. - -**Reference Files:** -- `packages/desktop/src-tauri/Cargo.toml:1-43` -- `packages/desktop/src-tauri/tauri.prod.conf.json:1-33` - -#### 2.3 Add Mobile Commands - -- [ ] Create mobile-specific Tauri commands: - -```rust -// packages/desktop/src-tauri/src/mobile.rs (new file) - -#[cfg(mobile)] -use tauri::command; - -#[cfg(mobile)] -#[command] -pub fn get_server_url() -> String { - // Return configured server URL for remote connection - std::env::var("SHUVCODE_SERVER_URL") - .unwrap_or_else(|_| "https://your-server.shuv.ai".to_string()) -} - -#[cfg(mobile)] -#[command] -pub fn is_mobile() -> bool { - true -} -``` - -### Phase 3: Mobile Capabilities & Permissions - -#### 3.1 Create Mobile Capabilities File - -- [ ] Create `packages/desktop/src-tauri/capabilities/mobile.json`: - -```json -{ - "$schema": "../gen/schemas/mobile-schema.json", - "identifier": "mobile", - "description": "Capability for mobile platforms", - "platforms": ["android", "iOS"], - "permissions": [ - "core:default", - "opener:default", - "dialog:default", - "store:default", - "os:default", - "notification:default", - { - "identifier": "http:default", - "allow": [ - { "url": "http://*" }, - { "url": "https://*" } - ] - } - ] -} -``` - -**Reference Files:** -- `packages/desktop/src-tauri/capabilities/default.json:1-29` - -#### 3.2 Configure Android Permissions - -- [ ] Update `AndroidManifest.xml` (generated, may need customization): - -```xml - - - - - - - - - - -``` - -#### 3.3 Configure iOS Permissions - -- [ ] Update `Info.plist` (generated, may need customization): - -```xml - -UIFileSharingEnabled - -LSSupportsOpeningDocumentsInPlace - - - -NSUserNotificationUsageDescription -Notifications for agent completions and errors -``` - -### Phase 4: Frontend Mobile Platform Implementation - -#### 4.1 Create Mobile Platform Context - -- [ ] Create `packages/desktop/src/mobile.tsx`: - -```tsx -// Mobile platform implementation -import { Platform, PlatformProvider } from "@opencode-ai/app" -import { App } from "@opencode-ai/app" -import { AsyncStorage } from "@solid-primitives/storage" -import { Store } from "@tauri-apps/plugin-store" -import { fetch as tauriFetch } from "@tauri-apps/plugin-http" -import { open as shellOpen } from "@tauri-apps/plugin-opener" -import pkg from "../package.json" - -const mobilePlatform: Platform = { - platform: "mobile" as const, // New platform type - version: pkg.version, - - openLink(url: string) { - void shellOpen(url).catch(() => undefined) - }, - - storage: (name = "default.dat") => { - // Reuse the exact AsyncStorage implementation from packages/desktop/src/index.tsx - // so persisted stores (server.v4, notification.v1, etc.) behave identically. - const api: AsyncStorage = { - // ... (copy implementation, no stub) - } - return api - }, - - restart: async () => { - // Mobile apps don't restart - reload webview - window.location.reload() - }, - - notify: async (title, description, href) => { - // Use Tauri notification plugin - // Implementation depends on plugin availability - }, - - // Mobile-specific: No directory picker (use server-side browse) - // Mobile-specific: No file picker (limited) - // Mobile-specific: No updater (app store) - - fetch: tauriFetch as typeof fetch, -} - -export function MobileApp() { - return ( - - - - ) -} -``` - -**Reference Files:** -- `packages/desktop/src/index.tsx:1-207` -- `packages/app/src/context/platform.tsx:1-58` - -#### 4.2 Update Platform Type and Branches - -- [ ] Update `packages/app/src/context/platform.tsx` to include `"mobile"` in the platform union. -- [ ] Extend the `Window.__SHUVCODE__` type in `packages/app/src/app.tsx` to include `serverUrl?: string` for mobile server injection. -- [ ] Audit platform branches (for example, `platform.platform === "desktop"` in `packages/app/src/pages/session.tsx`) and define mobile behavior. Default to web behavior unless a mobile-specific override is required. -- [ ] Keep directory/file picker APIs undefined on mobile so browse buttons are hidden in `DialogCreateProject`. - -```tsx -export type Platform = { - /** Platform discriminator */ - platform: "web" | "desktop" | "mobile" - // ... rest unchanged -} - -declare global { - interface Window { - __SHUVCODE__?: { updaterEnabled?: boolean; port?: number; serverUrl?: string } - } -} -``` - -#### 4.3 Create Mobile Entry Point - -- [ ] Create `packages/desktop/src/mobile-entry.tsx` that resolves the mobile server URL via `invoke("get_server_url")`, injects it into `window.__SHUVCODE__`, then renders `MobileApp`. -- [ ] Ensure this runs before `App` renders so `defaultServerUrl` can read `window.__SHUVCODE__.serverUrl`. -- [ ] If top-level await is not supported by the current build target, wrap the initialization in an async IIFE before calling `render()`. - -```tsx -// Mobile-specific entry point -import { render } from "solid-js/web" -import { invoke } from "@tauri-apps/api/core" -import { MobileApp } from "./mobile" - -const root = document.getElementById("root") -if (!(root instanceof HTMLElement)) { - throw new Error("Root element not found") -} - -const serverUrl = await invoke("get_server_url").catch(() => "") -if (serverUrl) { - window.__SHUVCODE__ = { ...(window.__SHUVCODE__ ?? {}), serverUrl } -} - -render(() => , root) -``` - -#### 4.4 Configure Vite/HTML for Mobile - -- [ ] Validate how `@opencode-ai/app/vite` handles entrypoints; prefer reusing `packages/desktop/index.html` to preserve the theme preload script and current meta tags. -- [ ] If a separate HTML entry is required, duplicate `packages/desktop/index.html` to `packages/desktop/mobile.html` and keep the `oc-theme-preload-script` and existing meta tags. Only then update `packages/desktop/vite.config.ts` to point to the alternate HTML. - -### Phase 5: Server Connection Strategy - -#### 5.1 Remote Server Configuration (reuse existing server flow) - -For the initial mobile release, the app will act as a remote-server client and reuse the existing server selection/persistence system: - -- [ ] Inject the mobile default server URL via `window.__SHUVCODE__.serverUrl` (set in the mobile entry) and update `defaultServerUrl` in `packages/app/src/app.tsx` to check this before localhost/origin. -- [ ] Reuse `ServerProvider` persistence (`server.v4`) and `DialogSelectServer` for adding/switching servers (no mobile-only server dialog). -- [ ] Confirm health checks and requests use `platform.fetch` so Tauri's HTTP plugin is respected on mobile. - -```tsx -// packages/app/src/app.tsx -const defaultServerUrl = iife(() => { - if (window.__SHUVCODE__?.serverUrl) return window.__SHUVCODE__.serverUrl - // existing resolution logic... -}) -``` - -#### 5.2 Mobile UX for Remote Filesystem - -- [ ] Update copy in `DialogCreateProject` to clarify that browsing/creating projects happens on the connected server filesystem when running on mobile. -- [ ] Keep `platform.openDirectoryPickerDialog` undefined on mobile so the Browse buttons remain hidden (already gated by `Show when={platform.openDirectoryPickerDialog}`). -- [ ] Confirm `StatusBar` is visible on mobile (PWA hiding logic should not apply) so `DialogSelectServer` remains reachable. -- [ ] Document the authentication flow for remote servers (OAuth/deep link if required). - -### Phase 6: Build & Test Infrastructure - -#### 6.1 Android Development Setup - -- [ ] Document Android SDK requirements: - - Android Studio - - Android SDK (API 24+) - - NDK (for Rust compilation) - - Java 17+ - -- [ ] Add npm scripts to `packages/desktop/package.json`: - -```json -{ - "scripts": { - "android:init": "tauri android init", - "android:dev": "tauri android dev", - "android:build": "tauri android build", - "android:build:apk": "tauri android build --apk", - "android:build:aab": "tauri android build --aab" - } -} -``` - -#### 6.2 iOS Development Setup - -- [ ] Document iOS development requirements: - - macOS - - Xcode 14+ - - Apple Developer account - - iOS Simulator or device - -- [ ] Add npm scripts: - -```json -{ - "scripts": { - "ios:init": "tauri ios init", - "ios:dev": "tauri ios dev", - "ios:build": "tauri ios build" - } -} -``` - -#### 6.3 Rust Target Installation - -- [ ] Document required Rust targets: - -```bash -# Android targets -rustup target add aarch64-linux-android -rustup target add armv7-linux-androideabi -rustup target add i686-linux-android -rustup target add x86_64-linux-android - -# iOS targets -rustup target add aarch64-apple-ios -rustup target add x86_64-apple-ios -rustup target add aarch64-apple-ios-sim -``` - -### Phase 7: CI/CD Integration - -#### 7.1 Android Build Workflow - -- [ ] Create `.github/workflows/mobile-android.yml`: - -```yaml -name: Android Build - -on: - push: - tags: - - 'android-v*' - workflow_dispatch: - -jobs: - build-android: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Android SDK - uses: android-actions/setup-android@v3 - - - name: Setup Rust - uses: dtolnay/rust-action@stable - with: - targets: aarch64-linux-android,armv7-linux-androideabi - - - name: Setup Bun - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - working-directory: packages/desktop - - - name: Build Android - run: bun tauri android build --apk - working-directory: packages/desktop - - - name: Upload APK - uses: actions/upload-artifact@v4 - with: - name: android-apk - path: packages/desktop/src-tauri/gen/android/app/build/outputs/apk/ -``` - -#### 7.2 iOS Build Workflow - -- [ ] Create `.github/workflows/mobile-ios.yml`: - -```yaml -name: iOS Build - -on: - push: - tags: - - 'ios-v*' - workflow_dispatch: - -jobs: - build-ios: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: latest-stable - - - name: Setup Rust - uses: dtolnay/rust-action@stable - with: - targets: aarch64-apple-ios,aarch64-apple-ios-sim - - - name: Setup Bun - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - working-directory: packages/desktop - - - name: Build iOS - run: bun tauri ios build - working-directory: packages/desktop - env: - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} -``` - -### Phase 8: Testing Strategy - -#### 8.1 Automated Tests - -- [ ] Add tests (or a minimal harness) for `defaultServerUrl` resolution and server persistence behavior. If no frontend test harness exists, document why and rely on manual validation. - -#### 8.2 Manual Testing Checklist - -- [ ] **App Launch** - - [ ] App launches without crash - - [ ] Server connection established - - [ ] Server selection dialog opens and persists choice - - [ ] Login/authentication works - -- [ ] **Session Management** - - [ ] Create new session - - [ ] View session list - - [ ] Switch between sessions - - [ ] Delete session - -- [ ] **Chat Interface** - - [ ] Send message - - [ ] View AI response - - [ ] Code blocks render correctly - - [ ] Markdown formatting works - -- [ ] **Mobile UI** - - [ ] Mobile sidebar works (drawer) - - [ ] Pull-to-refresh works - - [ ] Keyboard visibility handled - - [ ] Safe area insets correct - - [ ] Orientation changes handled - -- [ ] **Offline Behavior** - - [ ] Graceful error on no connection - - [ ] Reconnection when network restored - - [ ] No offline usage in MVP unless embedded server is implemented - -#### 8.3 Platform-Specific Testing - -**Android:** -- [ ] Back button behavior -- [ ] Recent apps thumbnail -- [ ] Local notifications (non-push) -- [ ] Deep linking - -**iOS:** -- [ ] Home indicator handling -- [ ] Dynamic Island compatibility -- [ ] Face ID/Touch ID (if applicable) -- [ ] Local notifications (non-push) - -### Phase 9: App Store Preparation - -#### 9.1 Android Play Store - -- [ ] Create signing keystore -- [ ] Configure `build.gradle.kts` for release signing -- [ ] Prepare Play Store listing: - - App name: "shuvcode" - - Short description - - Full description - - Screenshots (phone, tablet) - - Feature graphic - - Privacy policy URL - -#### 9.2 iOS App Store - -- [ ] Apple Developer account setup -- [ ] App Store Connect configuration -- [ ] Prepare App Store listing: - - App name - - Description - - Keywords - - Screenshots (all required sizes) - - Privacy policy URL - - App Privacy labels - -## External References - -### Tauri Mobile Documentation - -- https://v2.tauri.app/start/prerequisites/ - Setup requirements -- https://v2.tauri.app/develop/configuration-files/ - Config structure -- https://v2.tauri.app/reference/cli/ - CLI commands (`tauri android`, `tauri ios`) -- https://v2.tauri.app/security/capabilities/ - Mobile capabilities -- https://v2.tauri.app/security/permissions/ - Permission system -- https://v2.tauri.app/develop/plugins/develop-mobile/ - Mobile plugin development -- https://v2.tauri.app/distribute/sign/android/ - Android signing - -### Example Tauri Mobile Projects - -- https://github.com/tauri-apps/cargo-mobile2 - cargo-mobile2 tool -- https://github.com/jbilcke/latent-browser - Example mobile Tauri app -- https://github.com/readest/readest - Production Tauri mobile app -- https://github.com/EasyTier/EasyTier - Cross-platform including mobile - -### Tauri Plugins - -- https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins - Official plugins -- Notable mobile-compatible plugins: - - `tauri-plugin-http` - Network requests - - `tauri-plugin-notification` - Local/system notifications (non-push) - - `tauri-plugin-store` - Key-value storage - - `tauri-plugin-os` - OS information - - `tauri-plugin-dialog` - File dialogs (limited on mobile) - -## Internal File References - -### Core Files to Modify - -| File | Purpose | Changes Required | -|------|---------|------------------| -| `packages/desktop/src-tauri/src/lib.rs` | Tauri app entry | Split desktop vs mobile boot; gate sidecar/plugins | -| `packages/desktop/src-tauri/Cargo.toml` | Rust deps | Target-specific deps for mobile vs desktop | -| `packages/desktop/src-tauri/tauri.conf.json` | App config | Shared identifiers/defaults | -| `packages/desktop/src-tauri/tauri.prod.conf.json` | Prod config | Desktop-only updater config; avoid mobile | -| `packages/desktop/src-tauri/capabilities/default.json` | Desktop permissions | Keep desktop capabilities separate | -| `packages/desktop/vite.config.ts` | Vite config | Optional entrypoint adjustments (validate plugin) | -| `packages/desktop/index.html` | HTML template | Preserve theme preload if duplicated for mobile | -| `packages/desktop/package.json` | NPM scripts | Mobile build commands | -| `packages/app/src/app.tsx` | App bootstrap | `defaultServerUrl` mobile hook + `__SHUVCODE__` typing | -| `packages/app/src/pages/session.tsx` | Platform layout | Confirm mobile vs desktop branching | -| `packages/app/src/context/server.tsx` | Server state | Reuse persisted server list on mobile | -| `packages/app/src/components/dialog-select-server.tsx` | Server UI | Reuse for mobile server selection | -| `packages/app/src/context/platform.tsx` | Platform types | Add "mobile" type | - -### Files to Create - -| File | Purpose | -|------|---------| -| `packages/desktop/src/mobile.tsx` | Mobile platform implementation | -| `packages/desktop/src/mobile-entry.tsx` | Mobile entry point | -| `packages/desktop/mobile.html` | Mobile HTML template (optional) | -| `packages/desktop/src-tauri/capabilities/mobile.json` | Mobile capabilities | -| `packages/desktop/src-tauri/src/mobile.rs` | Mobile Rust commands | -| `packages/desktop/src-tauri/tauri.android.conf.json` | Android config overrides | -| `packages/desktop/src-tauri/tauri.ios.conf.json` | iOS config overrides | -| `.github/workflows/mobile-android.yml` | Android CI | -| `.github/workflows/mobile-ios.yml` | iOS CI | - -### Existing PWA Mobile Components (Reuse) - -| File | What to Reuse | -|------|---------------| -| `packages/app/src/components/mobile-terminal-input.tsx` | Terminal keyboard bridge | -| `packages/app/src/components/pull-to-refresh.tsx` | Pull gesture handler | -| `packages/app/src/hooks/use-keyboard-visibility.tsx` | Keyboard detection | -| `packages/app/src/context/layout.tsx` | mobileSidebar state | -| `packages/app/src/pages/session.tsx` | Mobile tabs, mobileReview | -| `packages/app/src/index.css` | Safe area CSS variables | - -## Risk Assessment - -| Risk | Impact | Likelihood | Mitigation | -|------|--------|------------|------------| -| Sidecar not possible on mobile | High | Certain | Remote server architecture | -| Remote server UX mismatch with local filesystem | Medium | Medium | Update UI copy/flows; hide local browse controls on mobile | -| Server URL resolution/persistence regressions | Medium | Medium | Integrate with `ServerProvider` + add tests for `defaultServerUrl` | -| Performance issues | Medium | Medium | Profile and optimize, reduce bundle | -| App Store rejection | High | Low | Follow guidelines, thorough testing | -| Terminal depends on remote PTY | Medium | Medium | Require healthy remote server; document no offline support | -| iOS signing complexity | Low | Medium | Document process, use CI | - -## Success Criteria - -1. **MVP (Phase 1-5):** - - [ ] App builds for Android and iOS - - [ ] Connects to remote shuvcode server and passes health checks - - [ ] Server selection persists via `ServerProvider` (`server.v4`) - - [ ] Basic chat functionality works - - [ ] Mobile UI renders correctly, with remote filesystem copy in project flows - - [ ] Offline mode shows clear error messaging (no offline support in MVP) - -2. **Beta (Phase 6-7):** - - [ ] CI builds working - - [ ] Internal testing complete - - [ ] Performance acceptable - -3. **Release (Phase 8-9):** - - [ ] All manual tests pass - - [ ] App Store listings prepared - - [ ] First public release - -## Timeline Estimate - -| Phase | Duration | Dependencies | -|-------|----------|--------------| -| Phase 1: Init | 1-2 days | None | -| Phase 2: Rust | 2-3 days | Phase 1 | -| Phase 3: Capabilities | 1 day | Phase 2 | -| Phase 4: Frontend | 2-3 days | Phase 2 | -| Phase 5: Server | 1-2 days | Phase 4 | -| Phase 6: Build | 2-3 days | Phase 5 | -| Phase 7: CI | 2-3 days | Phase 6 | -| Phase 8: Testing | 3-5 days | Phase 7 | -| Phase 9: Release | 2-5 days | Phase 8 | - -**Total Estimate:** 3-4 weeks for MVP, 5-6 weeks for full release - -## Future Enhancements - -After initial release, consider: - -1. **Embedded Server (Long-term)** - - Compile opencode core to static lib - - FFI bridge to Rust - - True offline capability - -2. **Git Integration** - - Clone repos to device - - Commit and push support - - SSH key management - -3. **Voice Input** - - Speech-to-text for prompts - - Hands-free operation - -4. **Widgets** - - iOS widgets for quick access - - Android app shortcuts - -5. **Watch Companion** - - Apple Watch notifications - - Wear OS integration diff --git a/README.md b/README.md index 6253ddd43b2f..91b38fae5e32 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ The following PRs have been merged into this fork and are awaiting merge into up | ----------------------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------ | ------ | ------------------------------------------------------------------------ | | [#6476](https://github.com/sst/opencode/pull/6476) | Edit suggested changes before applying | [@dmmulroy](https://github.com/dmmulroy) | Open | Press 'e' to edit AI suggestions in your editor before accepting | | [#6507](https://github.com/sst/opencode/pull/6507) | Optimize Ripgrep.tree() (109x faster) | [@Karavil](https://github.com/Karavil) | Open | 109x performance improvement for large repos by streaming ripgrep output | +| [#5432](https://github.com/sst/opencode/pull/5432) | Stream grep output to prevent OOM | [@Hona](https://github.com/Hona) | Open | Stream ripgrep output in grep tool to prevent memory exhaustion | | [#6360](https://github.com/sst/opencode/pull/6360) | Desktop: Edit Project | [@dbpolito](https://github.com/dbpolito) | Merged | Edit project name, icon color, and custom icon image in desktop sidebar | | [#6368](https://github.com/sst/opencode/pull/6368) | Desktop: Sidebar subsessions support | [@dbpolito](https://github.com/dbpolito) | Open | Expand/collapse subsessions in sidebar with chevron indicators | | [#6372](https://github.com/sst/opencode/pull/6372) | Desktop: Image Preview and Dedupe | [@dbpolito](https://github.com/dbpolito) | Merged | Click user attachments to preview images, dedupe file uploads | @@ -82,7 +83,7 @@ The following PRs have been merged into this fork and are awaiting merge into up | [#5968](https://github.com/sst/opencode/pull/5968) | Better styling for small screens | [@rekram1-node](https://github.com/rekram1-node) | Reverted | Responsive TUI layout hiding elements on short/narrow terminals | | [#140](https://github.com/Latitudes-Dev/shuvcode/pull/140) | Toggle transparent background | [@JosXa](https://github.com/JosXa) | Open | Command palette toggle for transparent TUI background on any theme | -_Last updated: 2026-01-04_ +_Last updated: 2026-01-07_ **Note:** Granular File Permissions (ariane-emory) was removed in v1.1.1 integration - upstream now provides similar functionality via PermissionNext. diff --git a/STATS.md b/STATS.md index 9effacbb1f0e..9ee486d20ed5 100644 --- a/STATS.md +++ b/STATS.md @@ -193,3 +193,4 @@ | 2026-01-04 | 1,672,656 (+39,702) | 1,339,883 (+7,969) | 3,012,539 (+62,560) | | 2026-01-05 | 1,738,171 (+65,515) | 1,353,043 (+13,160) | 3,091,214 (+78,675) | | 2026-01-06 | 1,960,988 (+222,817) | 1,377,377 (+24,334) | 3,338,365 (+247,151) | +| 2026-01-07 | 2,123,239 (+162,251) | 1,398,648 (+21,271) | 3,521,887 (+183,522) | diff --git a/STYLE_GUIDE.md b/STYLE_GUIDE.md index 164f69bd46ce..47d008fb423d 100644 --- a/STYLE_GUIDE.md +++ b/STYLE_GUIDE.md @@ -1,9 +1,7 @@ ## Style Guide - Try to keep things in one function unless composable or reusable -- DO NOT do unnecessary destructuring of variables -- DO NOT use `else` statements unless necessary -- DO NOT use `try`/`catch` if it can be avoided +- AVOID unnecessary destructuring of variables - AVOID `try`/`catch` where possible - AVOID `else` statements - AVOID using `any` type diff --git a/bun.lock b/bun.lock index f5edb263460b..fdbbf398526b 100644 --- a/bun.lock +++ b/bun.lock @@ -22,7 +22,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -71,7 +71,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", @@ -99,7 +99,7 @@ }, "packages/console/core": { "name": "@opencode-ai/console-core", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", @@ -126,7 +126,7 @@ }, "packages/console/function": { "name": "@opencode-ai/console-function", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -150,7 +150,7 @@ }, "packages/console/mail": { "name": "@opencode-ai/console-mail", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", @@ -174,9 +174,10 @@ }, "packages/desktop": { "name": "@shuvcode/desktop", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@opencode-ai/app": "workspace:*", + "@opencode-ai/ui": "workspace:*", "@solid-primitives/storage": "catalog:", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", @@ -202,7 +203,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@opencode-ai/ui": "workspace:*", "@opencode-ai/util": "workspace:*", @@ -231,7 +232,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -247,7 +248,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "1.1.4", + "version": "1.1.6", "bin": { "opencode": "./bin/opencode", }, @@ -351,7 +352,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -371,7 +372,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "1.1.4", + "version": "1.1.6", "devDependencies": { "@hey-api/openapi-ts": "0.88.1", "@tsconfig/node22": "catalog:", @@ -382,7 +383,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -395,7 +396,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -403,6 +404,7 @@ "@pierre/diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/bounds": "0.1.3", + "@solid-primitives/media": "2.3.3", "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", "@typescript/native-preview": "catalog:", @@ -433,7 +435,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "zod": "catalog:", }, @@ -444,7 +446,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/infra/console.ts b/infra/console.ts index 578546fc6b05..1e584ca576c3 100644 --- a/infra/console.ts +++ b/infra/console.ts @@ -76,6 +76,7 @@ export const stripeWebhook = new stripe.WebhookEndpoint("StripeWebhookEndpoint", "checkout.session.completed", "checkout.session.expired", "charge.refunded", + "invoice.payment_succeeded", "customer.created", "customer.deleted", "customer.updated", @@ -119,6 +120,7 @@ const ZEN_MODELS = [ new sst.Secret("ZEN_MODELS6"), new sst.Secret("ZEN_MODELS7"), ] +const ZEN_BLACK = new sst.Secret("ZEN_BLACK") const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY") const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", { properties: { value: auth.url.apply((url) => url!) }, @@ -160,6 +162,7 @@ new sst.cloudflare.x.SolidStart("Console", { EMAILOCTOPUS_API_KEY, AWS_SES_ACCESS_KEY_ID, AWS_SES_SECRET_ACCESS_KEY, + ZEN_BLACK, ...ZEN_MODELS, ...($dev ? [ diff --git a/nix/hashes.json b/nix/hashes.json index b3f1b8e2a969..e6d0b5ead073 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,3 +1,3 @@ { - "nodeModules": "sha256-mZGKIkOLmesEhCpEZTLiPbBisZOxdZ1NgqnRnVHJlLU=" + "nodeModules": "sha256-WHqX159BYPSHBFmxxkTrWPytBzTSTcWkoEywAxP58kI=" } diff --git a/nix/scripts/bun-build.ts b/nix/scripts/bun-build.ts index 4b54f49bdf2b..bbca0cb8e949 100644 --- a/nix/scripts/bun-build.ts +++ b/nix/scripts/bun-build.ts @@ -63,7 +63,12 @@ const result = await Bun.build({ compile: { target, outfile: "opencode", - execArgv: ["--user-agent=opencode/" + version, '--env-file=""', "--"], + autoloadBunfig: false, + autoloadDotenv: false, + //@ts-ignore (bun types aren't up to date) + autoloadTsconfig: true, + autoloadPackageJson: true, + execArgv: ["--user-agent=opencode/" + version, "--use-system-ca", "--"], windows: {}, }, }) diff --git a/packages/app/package.json b/packages/app/package.json index 4c00e20dc045..35a348d31b7e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.1.4", + "version": "1.1.6", "description": "", "type": "module", "exports": { diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index 4d9e88a910ff..e929667c85dd 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -1,5 +1,5 @@ import "@/index.css" -import { ErrorBoundary, Show, Suspense, lazy, type ParentProps } from "solid-js" +import { ErrorBoundary, Show, lazy, type ParentProps } from "solid-js" import { Router, Route, Navigate } from "@solidjs/router" import { MetaProvider } from "@solidjs/meta" import { Font } from "@opencode-ai/ui/font" @@ -20,10 +20,12 @@ import { FileProvider } from "@/context/file" import { NotificationProvider } from "@/context/notification" import { DialogProvider } from "@opencode-ai/ui/context/dialog" import { CommandProvider } from "@/context/command" +import { Logo } from "@opencode-ai/ui/logo" import Layout from "@/pages/layout" import DirectoryLayout from "@/pages/directory-layout" import { ErrorPage } from "./pages/error" import { iife } from "@opencode-ai/util/iife" +import { Suspense } from "solid-js" const Home = lazy(() => import("@/pages/home")) const Session = lazy(() => import("@/pages/session")) @@ -31,8 +33,8 @@ const Loading = () =>
+ }> - - - - - - ( - - - - - {props.children} - - - - - )} - > - ( - }> - - - )} - /> - - } /> - ( - - - - - }> - - - - - - - )} - /> - - - - - - - + {props.children} @@ -133,3 +76,66 @@ export function App() { ) } + +function ServerKey(props: ParentProps) { + const server = useServer() + return ( + + {props.children} + + ) +} + +export function AppInterface() { + return ( + + + + + ( + + + + + {props.children} + + + + + )} + > + ( + }> + + + )} + /> + + } /> + ( + + + + + }> + + + + + + + )} + /> + + + + + + + ) +} diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 1f3068aa7c3a..c257a93d045f 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -42,7 +42,7 @@ import { ModelSelectorPopover } from "@/components/dialog-select-model" import { DialogSelectModelUnpaid } from "@/components/dialog-select-model-unpaid" import { useProviders } from "@/hooks/use-providers" import { useCommand } from "@/context/command" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" import { Identifier } from "@/utils/id" import { SessionContextUsage } from "@/components/session-context-usage" import { usePermission } from "@/context/permission" @@ -189,7 +189,7 @@ export const PromptInput: Component = (props) => { const MAX_HISTORY = 100 const [history, setHistory] = persisted( - "prompt-history.v1", + Persist.global("prompt-history", ["prompt-history.v1"]), createStore<{ entries: Prompt[] }>({ @@ -197,7 +197,7 @@ export const PromptInput: Component = (props) => { }), ) const [shellHistory, setShellHistory] = persisted( - "prompt-history-shell.v1", + Persist.global("prompt-history-shell", ["prompt-history-shell.v1"]), createStore<{ entries: Prompt[] }>({ @@ -248,6 +248,8 @@ export const PromptInput: Component = (props) => { } } + const isFocused = createFocusSignal(() => editorRef) + createEffect(() => { params.id editorRef.focus() @@ -258,7 +260,6 @@ export const PromptInput: Component = (props) => { onCleanup(() => clearInterval(interval)) }) - const isFocused = createFocusSignal(() => editorRef) const [composing, setComposing] = createSignal(false) const isImeComposing = (event: KeyboardEvent) => event.isComposing || composing() || event.keyCode === 229 @@ -292,12 +293,13 @@ export const PromptInput: Component = (props) => { const clipboardData = event.clipboardData if (!clipboardData) return + event.preventDefault() + event.stopPropagation() + const items = Array.from(clipboardData.items) const imageItems = items.filter((item) => ACCEPTED_FILE_TYPES.includes(item.type)) if (imageItems.length > 0) { - event.preventDefault() - event.stopPropagation() for (const item of imageItems) { const file = item.getAsFile() if (file) await addImageAttachment(file) @@ -305,8 +307,6 @@ export const PromptInput: Component = (props) => { return } - event.preventDefault() - event.stopPropagation() const plainText = clipboardData.getData("text/plain") ?? "" addPart({ type: "text", content: plainText, start: 0, end: 0 }) } @@ -347,13 +347,11 @@ export const PromptInput: Component = (props) => { } onMount(() => { - editorRef.addEventListener("paste", handlePaste) document.addEventListener("dragover", handleGlobalDragOver) document.addEventListener("dragleave", handleGlobalDragLeave) document.addEventListener("drop", handleGlobalDrop) }) onCleanup(() => { - editorRef.removeEventListener("paste", handlePaste) document.removeEventListener("dragover", handleGlobalDragOver) document.removeEventListener("dragleave", handleGlobalDragLeave) document.removeEventListener("drop", handleGlobalDrop) @@ -1528,6 +1526,7 @@ export const PromptInput: Component = (props) => { }} contenteditable="true" onInput={handleInput} + onPaste={handlePaste} onCompositionStart={() => setComposing(true)} onCompositionEnd={() => setComposing(false)} onKeyDown={handleKeyDown} @@ -1613,14 +1612,14 @@ export const PromptInput: Component = (props) => { onClick={() => permission.toggleAutoAccept(params.id!, sdk.directory)} classList={{ "_hidden group-hover/prompt-input:flex size-6 items-center justify-center": true, - "text-text-base": !permission.isAutoAccepting(params.id!), - "hover:bg-surface-success-base": permission.isAutoAccepting(params.id!), + "text-text-base": !permission.isAutoAccepting(params.id!, sdk.directory), + "hover:bg-surface-success-base": permission.isAutoAccepting(params.id!, sdk.directory), }} > diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx index 283aad255feb..ab37627f5dcd 100644 --- a/packages/app/src/components/terminal.tsx +++ b/packages/app/src/components/terminal.tsx @@ -3,7 +3,7 @@ import { ComponentProps, createEffect, createSignal, onCleanup, onMount, Show, s import { useSDK } from "@/context/sdk" import { SerializeAddon } from "@/addons/serialize" import { LocalPTY } from "@/context/terminal" -import { resolveThemeVariant, useTheme } from "@opencode-ai/ui/theme" +import { resolveThemeVariant, useTheme, withAlpha, type HexColor } from "@opencode-ai/ui/theme" import { MobileTerminalInput } from "./mobile-terminal-input" export interface TerminalProps extends ComponentProps<"div"> { @@ -17,6 +17,7 @@ type TerminalColors = { background: string foreground: string cursor: string + selectionBackground: string } const DEFAULT_TERMINAL_COLORS: Record<"light" | "dark", TerminalColors> = { @@ -24,11 +25,13 @@ const DEFAULT_TERMINAL_COLORS: Record<"light" | "dark", TerminalColors> = { background: "#fcfcfc", foreground: "#211e1e", cursor: "#211e1e", + selectionBackground: withAlpha("#211e1e", 0.2), }, dark: { background: "#191515", foreground: "#d4d4d4", cursor: "#d4d4d4", + selectionBackground: withAlpha("#d4d4d4", 0.25), }, } @@ -62,10 +65,14 @@ export const Terminal = (props: TerminalProps) => { const resolved = resolveThemeVariant(variant, mode === "dark") const text = resolved["text-stronger"] ?? fallback.foreground const background = resolved["background-stronger"] ?? fallback.background + const alpha = mode === "dark" ? 0.25 : 0.2 + const base = text.startsWith("#") ? (text as HexColor) : (fallback.foreground as HexColor) + const selectionBackground = withAlpha(base, alpha) return { background, foreground: text, cursor: text, + selectionBackground, } } diff --git a/packages/app/src/context/file.tsx b/packages/app/src/context/file.tsx index a26f97c2a50d..050262ae6292 100644 --- a/packages/app/src/context/file.tsx +++ b/packages/app/src/context/file.tsx @@ -1,4 +1,4 @@ -import { createMemo, onCleanup } from "solid-js" +import { createEffect, createMemo, onCleanup } from "solid-js" import { createStore, produce } from "solid-js/store" import { createSimpleContext } from "@opencode-ai/ui/context" import type { FileContent } from "@opencode-ai/sdk/v2" @@ -7,7 +7,7 @@ import { useParams } from "@solidjs/router" import { getFilename } from "@opencode-ai/util/path" import { useSDK } from "./sdk" import { useSync } from "./sync" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" export type FileSelection = { startLine: number @@ -134,10 +134,10 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({ file: {}, }) - const viewKey = createMemo(() => `${params.dir}/file${params.id ? "/" + params.id : ""}.v1`) + const legacyViewKey = createMemo(() => `${params.dir}/file${params.id ? "/" + params.id : ""}.v1`) const [view, setView, _, ready] = persisted( - viewKey(), + Persist.scoped(params.dir!, params.id, "file-view", [legacyViewKey()]), createStore<{ file: Record }>({ @@ -145,6 +145,32 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({ }), ) + const MAX_VIEW_FILES = 500 + const viewMeta = { pruned: false } + + const pruneView = (keep?: string) => { + const keys = Object.keys(view.file) + if (keys.length <= MAX_VIEW_FILES) return + + const drop = keys.filter((key) => key !== keep).slice(0, keys.length - MAX_VIEW_FILES) + if (drop.length === 0) return + + setView( + produce((draft) => { + for (const key of drop) { + delete draft.file[key] + } + }), + ) + } + + createEffect(() => { + if (!ready()) return + if (viewMeta.pruned) return + viewMeta.pruned = true + pruneView() + }) + function ensure(path: string) { if (!path) return if (store.file[path]) return @@ -233,6 +259,7 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({ scrollTop: top, } }) + pruneView(path) } const setScrollLeft = (input: string, left: number) => { @@ -244,6 +271,7 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({ scrollLeft: left, } }) + pruneView(path) } const setSelectedLines = (input: string, range: SelectedLineRange | null) => { @@ -256,6 +284,7 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({ selectedLines: next, } }) + pruneView(path) } onCleanup(() => stop()) diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index efdb0405d1c8..07fb88b2d5ef 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -5,7 +5,7 @@ import { useGlobalSync } from "./global-sync" import { useGlobalSDK } from "./global-sdk" import { useServer } from "./server" import { Project } from "@opencode-ai/sdk/v2" -import { persisted } from "@/utils/persist" +import { Persist, persisted, removePersisted } from "@/utils/persist" import { applyTheme, DEFAULT_THEME_ID } from "@/theme/apply-theme" import { applyFontWithLoad } from "@/fonts/apply-font" import { getFontById, FONTS } from "@/fonts/font-definitions" @@ -58,7 +58,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const globalSync = useGlobalSync() const server = useServer() const [store, setStore, _, ready] = persisted( - "layout.v6", + Persist.global("layout", ["layout.v6"]), createStore({ sidebar: { opened: false, @@ -92,6 +92,29 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( const meta = { active: undefined as string | undefined, pruned: false } const used = new Map() + const SESSION_STATE_KEYS = [ + { key: "prompt", legacy: "prompt", version: "v2" }, + { key: "terminal", legacy: "terminal", version: "v1" }, + { key: "file-view", legacy: "file", version: "v1" }, + ] as const + + const dropSessionState = (keys: string[]) => { + for (const key of keys) { + const parts = key.split("/") + const dir = parts[0] + const session = parts[1] + if (!dir) continue + + for (const entry of SESSION_STATE_KEYS) { + const target = session ? Persist.session(dir, session, entry.key) : Persist.workspace(dir, entry.key) + void removePersisted(target) + + const legacyKey = `${dir}/${entry.legacy}${session ? "/" + session : ""}.${entry.version}` + void removePersisted({ key: legacyKey }) + } + } + } + function prune(keep?: string) { if (!keep) return @@ -119,6 +142,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext( ) scroll.drop(drop) + dropSessionState(drop) for (const key of drop) { used.delete(key) diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index 41250e80da5a..7fda593cc230 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -8,7 +8,7 @@ import { useSync } from "./sync" import { base64Encode } from "@opencode-ai/util/encode" import { useProviders } from "@/hooks/use-providers" import { DateTime } from "luxon" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" import { showToast } from "@opencode-ai/ui/toast" export type LocalFile = FileNode & @@ -111,7 +111,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const model = (() => { const [store, setStore, _, modelReady] = persisted( - "model.v1", + Persist.global("model", ["model.v1"]), createStore<{ user: (ModelKey & { visibility: "show" | "hide"; favorite?: boolean })[] recent: ModelKey[] diff --git a/packages/app/src/context/notification.tsx b/packages/app/src/context/notification.tsx index 09f32a3c434e..16b3d306c2d5 100644 --- a/packages/app/src/context/notification.tsx +++ b/packages/app/src/context/notification.tsx @@ -1,5 +1,5 @@ import { createStore } from "solid-js/store" -import { onCleanup } from "solid-js" +import { createEffect, onCleanup } from "solid-js" import { createSimpleContext } from "@opencode-ai/ui/context" import { useGlobalSDK } from "./global-sdk" import { useGlobalSync } from "./global-sync" @@ -10,7 +10,7 @@ import { EventSessionError } from "@opencode-ai/sdk/v2" import { makeAudioPlayer } from "@solid-primitives/audio" import idleSound from "@opencode-ai/ui/audio/staplebops-01.aac" import errorSound from "@opencode-ai/ui/audio/nope-03.aac" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" type NotificationBase = { directory?: string @@ -31,6 +31,16 @@ type ErrorNotification = NotificationBase & { export type Notification = TurnCompleteNotification | ErrorNotification +const MAX_NOTIFICATIONS = 500 +const NOTIFICATION_TTL_MS = 1000 * 60 * 60 * 24 * 30 + +function pruneNotifications(list: Notification[]) { + const cutoff = Date.now() - NOTIFICATION_TTL_MS + const pruned = list.filter((n) => n.time >= cutoff) + if (pruned.length <= MAX_NOTIFICATIONS) return pruned + return pruned.slice(pruned.length - MAX_NOTIFICATIONS) +} + export const { use: useNotification, provider: NotificationProvider } = createSimpleContext({ name: "Notification", init: () => { @@ -49,12 +59,25 @@ export const { use: useNotification, provider: NotificationProvider } = createSi const platform = usePlatform() const [store, setStore, _, ready] = persisted( - "notification.v1", + Persist.global("notification", ["notification.v1"]), createStore({ list: [] as Notification[], }), ) + const meta = { pruned: false } + + createEffect(() => { + if (!ready()) return + if (meta.pruned) return + meta.pruned = true + setStore("list", pruneNotifications(store.list)) + }) + + const append = (notification: Notification) => { + setStore("list", (list) => pruneNotifications([...list, notification])) + } + const unsub = globalSDK.event.listen((e) => { const directory = e.name const event = e.details @@ -73,7 +96,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi try { idlePlayer?.play() } catch {} - setStore("list", store.list.length, { + append({ ...base, type: "turn-complete", session: sessionID, @@ -92,7 +115,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi errorPlayer?.play() } catch {} const error = "error" in event.properties ? event.properties.error : undefined - setStore("list", store.list.length, { + append({ ...base, type: "error", session: sessionID ?? "global", diff --git a/packages/app/src/context/permission.tsx b/packages/app/src/context/permission.tsx index d47d850b9675..52878ba8f800 100644 --- a/packages/app/src/context/permission.tsx +++ b/packages/app/src/context/permission.tsx @@ -1,12 +1,12 @@ import { createMemo, onCleanup } from "solid-js" -import { createStore } from "solid-js/store" +import { createStore, produce } from "solid-js/store" import { createSimpleContext } from "@opencode-ai/ui/context" import type { PermissionRequest } from "@opencode-ai/sdk/v2/client" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" import { useGlobalSDK } from "@/context/global-sdk" import { useGlobalSync } from "./global-sync" import { useParams } from "@solidjs/router" -import { base64Decode } from "@opencode-ai/util/encode" +import { base64Decode, base64Encode } from "@opencode-ai/util/encode" type PermissionRespondFn = (input: { sessionID: string @@ -19,6 +19,32 @@ function shouldAutoAccept(perm: PermissionRequest) { return perm.permission === "edit" } +function isNonAllowRule(rule: unknown) { + if (!rule) return false + if (typeof rule === "string") return rule !== "allow" + if (typeof rule !== "object") return false + if (Array.isArray(rule)) return false + + for (const action of Object.values(rule)) { + if (action !== "allow") return true + } + + return false +} + +function hasAutoAcceptPermissionConfig(permission: unknown) { + if (!permission) return false + if (typeof permission === "string") return permission !== "allow" + if (typeof permission !== "object") return false + if (Array.isArray(permission)) return false + + const config = permission as Record + if (isNonAllowRule(config.edit)) return true + if (isNonAllowRule(config.write)) return true + + return false +} + export const { use: usePermission, provider: PermissionProvider } = createSimpleContext({ name: "Permission", init: () => { @@ -27,13 +53,14 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple const globalSync = useGlobalSync() const permissionsEnabled = createMemo(() => { - if (!params.dir || !base64Decode(params.dir)) return false - const [store] = globalSync.child(base64Decode(params.dir)) - return store.config.permission !== undefined + const directory = params.dir ? base64Decode(params.dir) : undefined + if (!directory) return false + const [store] = globalSync.child(directory) + return hasAutoAcceptPermissionConfig(store.config.permission) }) const [store, setStore, _, ready] = persisted( - "permission.v3", + Persist.global("permission", ["permission.v3"]), createStore({ autoAcceptEdits: {} as Record, }), @@ -58,8 +85,14 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple }) } - function isAutoAccepting(sessionID: string) { - return store.autoAcceptEdits[sessionID] ?? false + function acceptKey(sessionID: string, directory?: string) { + if (!directory) return sessionID + return `${base64Encode(directory)}/${sessionID}` + } + + function isAutoAccepting(sessionID: string, directory?: string) { + const key = acceptKey(sessionID, directory) + return store.autoAcceptEdits[key] ?? store.autoAcceptEdits[sessionID] ?? false } const unsubscribe = globalSDK.event.listen((e) => { @@ -67,7 +100,7 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple if (event?.type !== "permission.asked") return const perm = event.properties - if (!isAutoAccepting(perm.sessionID)) return + if (!isAutoAccepting(perm.sessionID, e.name)) return if (!shouldAutoAccept(perm)) return respondOnce(perm, e.name) @@ -75,7 +108,13 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple onCleanup(unsubscribe) function enable(sessionID: string, directory: string) { - setStore("autoAcceptEdits", sessionID, true) + const key = acceptKey(sessionID, directory) + setStore( + produce((draft) => { + draft.autoAcceptEdits[key] = true + delete draft.autoAcceptEdits[sessionID] + }), + ) globalSDK.client.permission .list({ directory }) @@ -90,31 +129,37 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple .catch(() => undefined) } - function disable(sessionID: string) { - setStore("autoAcceptEdits", sessionID, false) + function disable(sessionID: string, directory?: string) { + const key = directory ? acceptKey(sessionID, directory) : undefined + setStore( + produce((draft) => { + if (key) delete draft.autoAcceptEdits[key] + delete draft.autoAcceptEdits[sessionID] + }), + ) } return { ready, respond, - autoResponds(permission: PermissionRequest) { - return isAutoAccepting(permission.sessionID) && shouldAutoAccept(permission) + autoResponds(permission: PermissionRequest, directory?: string) { + return isAutoAccepting(permission.sessionID, directory) && shouldAutoAccept(permission) }, isAutoAccepting, toggleAutoAccept(sessionID: string, directory: string) { - if (isAutoAccepting(sessionID)) { - disable(sessionID) + if (isAutoAccepting(sessionID, directory)) { + disable(sessionID, directory) return } enable(sessionID, directory) }, enableAutoAccept(sessionID: string, directory: string) { - if (isAutoAccepting(sessionID)) return + if (isAutoAccepting(sessionID, directory)) return enable(sessionID, directory) }, - disableAutoAccept(sessionID: string) { - disable(sessionID) + disableAutoAccept(sessionID: string, directory?: string) { + disable(sessionID, directory) }, permissionsEnabled, } diff --git a/packages/app/src/context/prompt.tsx b/packages/app/src/context/prompt.tsx index f77f62e3ca5e..2fa4571e8903 100644 --- a/packages/app/src/context/prompt.tsx +++ b/packages/app/src/context/prompt.tsx @@ -3,7 +3,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context" import { batch, createMemo } from "solid-js" import { useParams } from "@solidjs/router" import type { FileSelection } from "@/context/file" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" interface PartBase { content: string @@ -103,10 +103,10 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext( name: "Prompt", init: () => { const params = useParams() - const name = createMemo(() => `${params.dir}/prompt${params.id ? "/" + params.id : ""}.v2`) + const legacy = createMemo(() => `${params.dir}/prompt${params.id ? "/" + params.id : ""}.v2`) const [store, setStore, _, ready] = persisted( - name(), + Persist.scoped(params.dir!, params.id, "prompt", [legacy()]), createStore<{ prompt: Prompt cursor?: number diff --git a/packages/app/src/context/server.tsx b/packages/app/src/context/server.tsx index 9d3e70986d69..32bfbacd2829 100644 --- a/packages/app/src/context/server.tsx +++ b/packages/app/src/context/server.tsx @@ -3,7 +3,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context" import { batch, createEffect, createMemo, createSignal, onCleanup } from "solid-js" import { createStore } from "solid-js/store" import { usePlatform } from "@/context/platform" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" type StoredProject = { worktree: string; expanded: boolean } @@ -39,7 +39,7 @@ export const { use: useServer, provider: ServerProvider } = createSimpleContext( const platform = usePlatform() const [store, setStore, _, ready] = persisted( - "server.v4", + Persist.global("server", ["server.v4", "server.v3"]), createStore({ list: [] as string[], projects: {} as Record, diff --git a/packages/app/src/context/terminal.tsx b/packages/app/src/context/terminal.tsx index e9a07077cef8..2ee0d137e38b 100644 --- a/packages/app/src/context/terminal.tsx +++ b/packages/app/src/context/terminal.tsx @@ -3,7 +3,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context" import { batch, createMemo } from "solid-js" import { useParams } from "@solidjs/router" import { useSDK } from "./sdk" -import { persisted } from "@/utils/persist" +import { Persist, persisted } from "@/utils/persist" export type LocalPTY = { id: string @@ -19,10 +19,10 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont init: () => { const sdk = useSDK() const params = useParams() - const name = createMemo(() => `${params.dir}/terminal${params.id ? "/" + params.id : ""}.v1`) + const legacy = createMemo(() => `${params.dir}/terminal${params.id ? "/" + params.id : ""}.v1`) const [store, setStore, _, ready] = persisted( - name(), + Persist.scoped(params.dir!, params.id, "terminal", [legacy()]), createStore<{ active?: string all: LocalPTY[] diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index a915aa25b89e..28741098c8e7 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -1,6 +1,6 @@ // @refresh reload import { render } from "solid-js/web" -import { App } from "@/app" +import { AppBaseProviders, AppInterface } from "@/app" import { Platform, PlatformProvider } from "@/context/platform" import pkg from "../package.json" @@ -55,7 +55,9 @@ const platform: Platform = { render( () => ( - + + + ), root!, diff --git a/packages/app/src/index.css b/packages/app/src/index.css index 8f6106d28e9e..97059dcbc358 100644 --- a/packages/app/src/index.css +++ b/packages/app/src/index.css @@ -95,19 +95,40 @@ body { --pwa-bottom-offset: var(--safe-area-inset-bottom); } - /* Ensure the app fills the screen properly in PWA mode */ + /* Critical iOS viewport locking - prevents rubber-banding on html/body */ + html { + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; + overscroll-behavior: none; + } + + body { + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; + overscroll-behavior: none; + } + + /* Root container must also be fixed to prevent viewport bounce */ #root { - min-height: 100vh; - min-height: -webkit-fill-available; - min-height: 100dvh; + position: fixed; + inset: 0; + overflow: hidden; + overscroll-behavior: none; + /* Safe areas handled by child components (header/prompt-dock) */ } .home-menu-button { top: var(--safe-area-inset-top); } + /* Scroll containers should contain overscroll within their bounds */ .session-scroll-container { overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; } } diff --git a/packages/app/src/index.ts b/packages/app/src/index.ts index cf5be9f512f9..df3181133e92 100644 --- a/packages/app/src/index.ts +++ b/packages/app/src/index.ts @@ -1,2 +1,2 @@ export { PlatformProvider, type Platform } from "./context/platform" -export { App } from "./app" +export { AppBaseProviders, AppInterface } from "./app" diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 8940846b0a15..b1221201c53a 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -176,7 +176,7 @@ export default function Layout(props: ParentProps) { if (e.details?.type !== "permission.asked") return const directory = e.name const perm = e.details.properties - if (permission.autoResponds(perm)) return + if (permission.autoResponds(perm, directory)) return const [store] = globalSync.child(directory) const session = store.session.find((s) => s.id === perm.sessionID) @@ -294,26 +294,30 @@ export default function Layout(props: ParentProps) { } } - function projectSessions(directory: string) { - if (!directory) return [] - const sessions = globalSync - .child(directory)[0] - .session.toSorted((a, b) => (b.time.updated ?? b.time.created) - (a.time.updated ?? a.time.created)) - return flattenSessions(sessions ?? []) + const currentProject = createMemo(() => { + const directory = params.dir ? base64Decode(params.dir) : undefined + if (!directory) return + return layout.projects.list().find((p) => p.worktree === directory || p.sandboxes?.includes(directory)) + }) + + function projectSessions(project: LocalProject | undefined) { + if (!project) return [] + const dirs = [project.worktree, ...(project.sandboxes ?? [])] + const stores = dirs.map((dir) => globalSync.child(dir)[0]) + const sessions = stores + .flatMap((store) => store.session.filter((session) => session.directory === store.path.directory)) + .toSorted(sortSessions) + return sessions.filter((s) => !s.parentID) } - const currentSessions = createMemo(() => { - if (!params.dir) return [] - const directory = base64Decode(params.dir) - return projectSessions(directory) - }) + const currentSessions = createMemo(() => projectSessions(currentProject())) function navigateSessionByOffset(offset: number) { const projects = layout.projects.list() if (projects.length === 0) return - const currentDirectory = params.dir ? base64Decode(params.dir) : undefined - const projectIndex = currentDirectory ? projects.findIndex((p) => p.worktree === currentDirectory) : -1 + const project = currentProject() + const projectIndex = project ? projects.findIndex((p) => p.worktree === project.worktree) : -1 if (projectIndex === -1) { const targetProject = offset > 0 ? projects[0] : projects[projects.length - 1] @@ -342,14 +346,14 @@ export default function Layout(props: ParentProps) { const nextProject = projects[nextProjectIndex] if (!nextProject) return - const nextProjectSessions = projectSessions(nextProject.worktree) + const nextProjectSessions = projectSessions(nextProject) if (nextProjectSessions.length === 0) { navigateToProject(nextProject.worktree) return } const targetSession = offset > 0 ? nextProjectSessions[0] : nextProjectSessions[nextProjectSessions.length - 1] - navigate(`/${base64Encode(nextProject.worktree)}/session/${targetSession.id}`) + navigateToSession(targetSession) queueMicrotask(() => scrollToSession(targetSession.id)) } @@ -476,7 +480,7 @@ export default function Layout(props: ParentProps) { function navigateToSession(session: Session | undefined) { if (!session) return - navigate(`/${params.dir}/session/${session?.id}`) + navigate(`/${base64Encode(session.directory)}/session/${session.id}`) layout.mobileSidebar.hide() } @@ -499,7 +503,8 @@ export default function Layout(props: ParentProps) { const id = params.id setStore("lastSession", directory, id) notification.session.markViewed(id) - untrack(() => layout.projects.expand(directory)) + const project = currentProject() + untrack(() => layout.projects.expand(project?.worktree ?? directory)) requestAnimationFrame(() => scrollToSession(id)) }) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index ffa7a6b7ebea..1b7093d1d129 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -573,7 +573,10 @@ export default function Page() { }, { id: "permissions.autoaccept", - title: params.id && permission.isAutoAccepting(params.id) ? "Stop auto-accepting edits" : "Auto-accept edits", + title: + params.id && permission.isAutoAccepting(params.id, sdk.directory) + ? "Stop auto-accepting edits" + : "Auto-accept edits", category: "Permissions", keybind: "mod+shift+a", disabled: !params.id || !permission.permissionsEnabled(), @@ -582,8 +585,10 @@ export default function Page() { if (!sessionID) return permission.toggleAutoAccept(sessionID, sdk.directory) showToast({ - title: permission.isAutoAccepting(sessionID) ? "Auto-accepting edits" : "Stopped auto-accepting edits", - description: permission.isAutoAccepting(sessionID) + title: permission.isAutoAccepting(sessionID, sdk.directory) + ? "Auto-accepting edits" + : "Stopped auto-accepting edits", + description: permission.isAutoAccepting(sessionID, sdk.directory) ? "Edit and write permissions will be automatically approved" : "Edit and write permissions will require approval", }) diff --git a/packages/app/src/utils/persist.ts b/packages/app/src/utils/persist.ts index 12b334f9f024..0c20ee31ca67 100644 --- a/packages/app/src/utils/persist.ts +++ b/packages/app/src/utils/persist.ts @@ -1,17 +1,235 @@ import { usePlatform } from "@/context/platform" -import { makePersisted } from "@solid-primitives/storage" +import { makePersisted, type AsyncStorage, type SyncStorage } from "@solid-primitives/storage" +import { checksum } from "@opencode-ai/util/encode" import { createResource, type Accessor } from "solid-js" import type { SetStoreFunction, Store } from "solid-js/store" type InitType = Promise | string | null type PersistedWithReady = [Store, SetStoreFunction, InitType, Accessor] -export function persisted(key: string, store: [Store, SetStoreFunction]): PersistedWithReady { +type PersistTarget = { + storage?: string + key: string + legacy?: string[] + migrate?: (value: unknown) => unknown +} + +const LEGACY_STORAGE = "default.dat" +const GLOBAL_STORAGE = "opencode.global.dat" + +function snapshot(value: unknown) { + return JSON.parse(JSON.stringify(value)) as unknown +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function merge(defaults: unknown, value: unknown): unknown { + if (value === undefined) return defaults + if (value === null) return value + + if (Array.isArray(defaults)) { + if (Array.isArray(value)) return value + return defaults + } + + if (isRecord(defaults)) { + if (!isRecord(value)) return defaults + + const result: Record = { ...defaults } + for (const key of Object.keys(value)) { + if (key in defaults) { + result[key] = merge((defaults as Record)[key], (value as Record)[key]) + } else { + result[key] = (value as Record)[key] + } + } + return result + } + + return value +} + +function parse(value: string) { + try { + return JSON.parse(value) as unknown + } catch { + return undefined + } +} + +function workspaceStorage(dir: string) { + const head = dir.slice(0, 12) || "workspace" + const sum = checksum(dir) ?? "0" + return `opencode.workspace.${head}.${sum}.dat` +} + +function localStorageWithPrefix(prefix: string): SyncStorage { + const base = `${prefix}:` + return { + getItem: (key) => localStorage.getItem(base + key), + setItem: (key, value) => localStorage.setItem(base + key, value), + removeItem: (key) => localStorage.removeItem(base + key), + } +} + +export const Persist = { + global(key: string, legacy?: string[]): PersistTarget { + return { storage: GLOBAL_STORAGE, key, legacy } + }, + workspace(dir: string, key: string, legacy?: string[]): PersistTarget { + return { storage: workspaceStorage(dir), key: `workspace:${key}`, legacy } + }, + session(dir: string, session: string, key: string, legacy?: string[]): PersistTarget { + return { storage: workspaceStorage(dir), key: `session:${session}:${key}`, legacy } + }, + scoped(dir: string, session: string | undefined, key: string, legacy?: string[]): PersistTarget { + if (session) return Persist.session(dir, session, key, legacy) + return Persist.workspace(dir, key, legacy) + }, +} + +export function removePersisted(target: { storage?: string; key: string }) { const platform = usePlatform() - const [state, setState, init] = makePersisted(store, { name: key, storage: platform.storage?.() ?? localStorage }) + const isDesktop = platform.platform === "desktop" && !!platform.storage + + if (isDesktop) { + return platform.storage?.(target.storage)?.removeItem(target.key) + } + + if (!target.storage) { + localStorage.removeItem(target.key) + return + } + + localStorageWithPrefix(target.storage).removeItem(target.key) +} + +export function persisted( + target: string | PersistTarget, + store: [Store, SetStoreFunction], +): PersistedWithReady { + const platform = usePlatform() + const config: PersistTarget = typeof target === "string" ? { key: target } : target + + const defaults = snapshot(store[0]) + const legacy = config.legacy ?? [] + + const isDesktop = platform.platform === "desktop" && !!platform.storage + + const currentStorage = (() => { + if (isDesktop) return platform.storage?.(config.storage) + if (!config.storage) return localStorage + return localStorageWithPrefix(config.storage) + })() + + const legacyStorage = (() => { + if (!isDesktop) return localStorage + if (!config.storage) return platform.storage?.() + return platform.storage?.(LEGACY_STORAGE) + })() + + const storage = (() => { + if (!isDesktop) { + const current = currentStorage as SyncStorage + const legacyStore = legacyStorage as SyncStorage + + const api: SyncStorage = { + getItem: (key) => { + const raw = current.getItem(key) + if (raw !== null) { + const parsed = parse(raw) + if (parsed === undefined) return raw + + const migrated = config.migrate ? config.migrate(parsed) : parsed + const merged = merge(defaults, migrated) + const next = JSON.stringify(merged) + if (raw !== next) current.setItem(key, next) + return next + } + + for (const legacyKey of legacy) { + const legacyRaw = legacyStore.getItem(legacyKey) + if (legacyRaw === null) continue + + current.setItem(key, legacyRaw) + legacyStore.removeItem(legacyKey) + + const parsed = parse(legacyRaw) + if (parsed === undefined) return legacyRaw + + const migrated = config.migrate ? config.migrate(parsed) : parsed + const merged = merge(defaults, migrated) + const next = JSON.stringify(merged) + if (legacyRaw !== next) current.setItem(key, next) + return next + } + + return null + }, + setItem: (key, value) => { + current.setItem(key, value) + }, + removeItem: (key) => { + current.removeItem(key) + }, + } + + return api + } + + const current = currentStorage as AsyncStorage + const legacyStore = legacyStorage as AsyncStorage | undefined + + const api: AsyncStorage = { + getItem: async (key) => { + const raw = await current.getItem(key) + if (raw !== null) { + const parsed = parse(raw) + if (parsed === undefined) return raw + + const migrated = config.migrate ? config.migrate(parsed) : parsed + const merged = merge(defaults, migrated) + const next = JSON.stringify(merged) + if (raw !== next) await current.setItem(key, next) + return next + } + + if (!legacyStore) return null + + for (const legacyKey of legacy) { + const legacyRaw = await legacyStore.getItem(legacyKey) + if (legacyRaw === null) continue + + await current.setItem(key, legacyRaw) + await legacyStore.removeItem(legacyKey) + + const parsed = parse(legacyRaw) + if (parsed === undefined) return legacyRaw + + const migrated = config.migrate ? config.migrate(parsed) : parsed + const merged = merge(defaults, migrated) + const next = JSON.stringify(merged) + if (legacyRaw !== next) await current.setItem(key, next) + return next + } + + return null + }, + setItem: async (key, value) => { + await current.setItem(key, value) + }, + removeItem: async (key) => { + await current.removeItem(key) + }, + } + + return api + })() + + const [state, setState, init] = makePersisted(store, { name: config.key, storage }) - // Create a resource that resolves when the store is initialized - // This integrates with Suspense and provides a ready signal const isAsync = init instanceof Promise const [ready] = createResource( () => init, diff --git a/packages/console/app/package.json b/packages/console/app/package.json index c65bba4b1aa6..bdd99b2ba63c 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/console/app/src/routes/stripe/webhook.ts b/packages/console/app/src/routes/stripe/webhook.ts index 3260f31b2296..c468d2d0c6bc 100644 --- a/packages/console/app/src/routes/stripe/webhook.ts +++ b/packages/console/app/src/routes/stripe/webhook.ts @@ -2,6 +2,7 @@ import { Billing } from "@opencode-ai/console-core/billing.js" import type { APIEvent } from "@solidjs/start/server" import { and, Database, eq, sql } from "@opencode-ai/console-core/drizzle/index.js" import { BillingTable, PaymentTable } from "@opencode-ai/console-core/schema/billing.sql.js" +import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" import { Identifier } from "@opencode-ai/console-core/identifier.js" import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js" import { Actor } from "@opencode-ai/console-core/actor.js" @@ -146,6 +147,242 @@ export async function POST(input: APIEvent) { .where(eq(BillingTable.workspaceID, workspaceID)) }) } + if (body.type === "invoice.payment_succeeded" && body.data.object.billing_reason === "subscription_cycle") { + const invoiceID = body.data.object.id as string + const amountInCents = body.data.object.amount_paid + const customerID = body.data.object.customer as string + const subscriptionID = body.data.object.parent?.subscription_details?.subscription as string + + if (!customerID) throw new Error("Customer ID not found") + if (!invoiceID) throw new Error("Invoice ID not found") + if (!subscriptionID) throw new Error("Subscription ID not found") + + const invoice = await Billing.stripe().invoices.retrieve(invoiceID, { + expand: ["payments"], + }) + const paymentID = invoice.payments?.data[0].payment.payment_intent as string + if (!paymentID) throw new Error("Payment ID not found") + + const workspaceID = await Database.use((tx) => + tx + .select({ workspaceID: BillingTable.workspaceID }) + .from(BillingTable) + .where(eq(BillingTable.customerID, customerID)) + .then((rows) => rows[0]?.workspaceID), + ) + if (!workspaceID) throw new Error("Workspace ID not found for customer") + + await Database.use((tx) => + tx.insert(PaymentTable).values({ + workspaceID, + id: Identifier.create("payment"), + amount: centsToMicroCents(amountInCents), + paymentID, + invoiceID, + customerID, + }), + ) + } + if (body.type === "customer.subscription.created") { + const data = { + id: "evt_1Smq802SrMQ2Fneksse5FMNV", + object: "event", + api_version: "2025-07-30.basil", + created: 1767766916, + data: { + object: { + id: "sub_1Smq7x2SrMQ2Fnek8F1yf3ZD", + object: "subscription", + application: null, + application_fee_percent: null, + automatic_tax: { + disabled_reason: null, + enabled: false, + liability: null, + }, + billing_cycle_anchor: 1770445200, + billing_cycle_anchor_config: null, + billing_mode: { + flexible: { + proration_discounts: "included", + }, + type: "flexible", + updated_at: 1770445200, + }, + billing_thresholds: null, + cancel_at: null, + cancel_at_period_end: false, + canceled_at: null, + cancellation_details: { + comment: null, + feedback: null, + reason: null, + }, + collection_method: "charge_automatically", + created: 1770445200, + currency: "usd", + customer: "cus_TkKmZZvysJ2wej", + customer_account: null, + days_until_due: null, + default_payment_method: null, + default_source: "card_1Smq7u2SrMQ2FneknjyOa7sq", + default_tax_rates: [], + description: null, + discounts: [], + ended_at: null, + invoice_settings: { + account_tax_ids: null, + issuer: { + type: "self", + }, + }, + items: { + object: "list", + data: [ + { + id: "si_TkKnBKXFX76t0O", + object: "subscription_item", + billing_thresholds: null, + created: 1770445200, + current_period_end: 1772864400, + current_period_start: 1770445200, + discounts: [], + metadata: {}, + plan: { + id: "price_1SmfFG2SrMQ2FnekJuzwHMea", + object: "plan", + active: true, + amount: 20000, + amount_decimal: "20000", + billing_scheme: "per_unit", + created: 1767725082, + currency: "usd", + interval: "month", + interval_count: 1, + livemode: false, + metadata: {}, + meter: null, + nickname: null, + product: "prod_Tk9LjWT1n0DgYm", + tiers_mode: null, + transform_usage: null, + trial_period_days: null, + usage_type: "licensed", + }, + price: { + id: "price_1SmfFG2SrMQ2FnekJuzwHMea", + object: "price", + active: true, + billing_scheme: "per_unit", + created: 1767725082, + currency: "usd", + custom_unit_amount: null, + livemode: false, + lookup_key: null, + metadata: {}, + nickname: null, + product: "prod_Tk9LjWT1n0DgYm", + recurring: { + interval: "month", + interval_count: 1, + meter: null, + trial_period_days: null, + usage_type: "licensed", + }, + tax_behavior: "unspecified", + tiers_mode: null, + transform_quantity: null, + type: "recurring", + unit_amount: 20000, + unit_amount_decimal: "20000", + }, + quantity: 1, + subscription: "sub_1Smq7x2SrMQ2Fnek8F1yf3ZD", + tax_rates: [], + }, + ], + has_more: false, + total_count: 1, + url: "/v1/subscription_items?subscription=sub_1Smq7x2SrMQ2Fnek8F1yf3ZD", + }, + latest_invoice: "in_1Smq7x2SrMQ2FnekSJesfPwE", + livemode: false, + metadata: {}, + next_pending_invoice_item_invoice: null, + on_behalf_of: null, + pause_collection: null, + payment_settings: { + payment_method_options: null, + payment_method_types: null, + save_default_payment_method: "off", + }, + pending_invoice_item_interval: null, + pending_setup_intent: null, + pending_update: null, + plan: { + id: "price_1SmfFG2SrMQ2FnekJuzwHMea", + object: "plan", + active: true, + amount: 20000, + amount_decimal: "20000", + billing_scheme: "per_unit", + created: 1767725082, + currency: "usd", + interval: "month", + interval_count: 1, + livemode: false, + metadata: {}, + meter: null, + nickname: null, + product: "prod_Tk9LjWT1n0DgYm", + tiers_mode: null, + transform_usage: null, + trial_period_days: null, + usage_type: "licensed", + }, + quantity: 1, + schedule: null, + start_date: 1770445200, + status: "active", + test_clock: "clock_1Smq6n2SrMQ2FnekQw4yt2PZ", + transfer_data: null, + trial_end: null, + trial_settings: { + end_behavior: { + missing_payment_method: "create_invoice", + }, + }, + trial_start: null, + }, + }, + livemode: false, + pending_webhooks: 0, + request: { + id: "req_6YO9stvB155WJD", + idempotency_key: "581ba059-6f86-49b2-9c49-0d8450255322", + }, + type: "customer.subscription.created", + } + } + if (body.type === "customer.subscription.deleted") { + const subscriptionID = body.data.object.id + if (!subscriptionID) throw new Error("Subscription ID not found") + + const workspaceID = await Database.use((tx) => + tx + .select({ workspaceID: BillingTable.workspaceID }) + .from(BillingTable) + .where(eq(BillingTable.subscriptionID, subscriptionID)) + .then((rows) => rows[0]?.workspaceID), + ) + if (!workspaceID) throw new Error("Workspace ID not found for subscription") + + await Database.transaction(async (tx) => { + await tx.update(BillingTable).set({ subscriptionID: null }).where(eq(BillingTable.workspaceID, workspaceID)) + + await tx.update(UserTable).set({ timeSubscribed: null }).where(eq(UserTable.workspaceID, workspaceID)) + }) + } })() .then((message) => { return Response.json({ message: message ?? "done" }, { status: 200 }) diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css b/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css new file mode 100644 index 000000000000..c189f0d6467a --- /dev/null +++ b/packages/console/app/src/routes/workspace/[id]/billing/black-section.module.css @@ -0,0 +1,8 @@ +.root { + [data-slot="title-row"] { + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--space-4); + } +} diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx new file mode 100644 index 000000000000..2eece1b62d2e --- /dev/null +++ b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx @@ -0,0 +1,58 @@ +import { action, useParams, useAction, useSubmission, json } from "@solidjs/router" +import { createStore } from "solid-js/store" +import { Billing } from "@opencode-ai/console-core/billing.js" +import { withActor } from "~/context/auth.withActor" +import { queryBillingInfo } from "../../common" +import styles from "./black-section.module.css" + +const createSessionUrl = action(async (workspaceID: string, returnUrl: string) => { + "use server" + return json( + await withActor( + () => + Billing.generateSessionUrl({ returnUrl }) + .then((data) => ({ error: undefined, data })) + .catch((e) => ({ + error: e.message as string, + data: undefined, + })), + workspaceID, + ), + { revalidate: queryBillingInfo.key }, + ) +}, "sessionUrl") + +export function BlackSection() { + const params = useParams() + const sessionAction = useAction(createSessionUrl) + const sessionSubmission = useSubmission(createSessionUrl) + const [store, setStore] = createStore({ + sessionRedirecting: false, + }) + + async function onClickSession() { + const result = await sessionAction(params.id!, window.location.href) + if (result.data) { + setStore("sessionRedirecting", true) + window.location.href = result.data + } + } + + return ( +
+
+

Subscription

+
+

You are subscribed to OpenCode Black for $200 per month.

+ +
+
+
+ ) +} diff --git a/packages/console/app/src/routes/workspace/[id]/billing/index.tsx b/packages/console/app/src/routes/workspace/[id]/billing/index.tsx index feb646514de9..16e16df7ae6d 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/index.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/index.tsx @@ -2,19 +2,23 @@ import { MonthlyLimitSection } from "./monthly-limit-section" import { BillingSection } from "./billing-section" import { ReloadSection } from "./reload-section" import { PaymentSection } from "./payment-section" +import { BlackSection } from "./black-section" import { Show } from "solid-js" import { createAsync, useParams } from "@solidjs/router" import { queryBillingInfo, querySessionInfo } from "../../common" export default function () { const params = useParams() - const userInfo = createAsync(() => querySessionInfo(params.id!)) + const sessionInfo = createAsync(() => querySessionInfo(params.id!)) const billingInfo = createAsync(() => queryBillingInfo(params.id!)) return (
- + + + + diff --git a/packages/console/app/src/routes/workspace/[id]/usage-section.tsx b/packages/console/app/src/routes/workspace/[id]/usage-section.tsx index 8ba5dfdbd165..662b2227b431 100644 --- a/packages/console/app/src/routes/workspace/[id]/usage-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/usage-section.tsx @@ -169,7 +169,9 @@ export function UsageSection() {
- ${((usage.cost ?? 0) / 100000000).toFixed(4)} + + ${usage.enrichment?.plan === "sub" ? "0.0000" : ((usage.cost ?? 0) / 100000000).toFixed(4)} + ) }} diff --git a/packages/console/app/src/routes/zen/util/error.ts b/packages/console/app/src/routes/zen/util/error.ts index f1e1314683c7..b97b73430741 100644 --- a/packages/console/app/src/routes/zen/util/error.ts +++ b/packages/console/app/src/routes/zen/util/error.ts @@ -1,6 +1,13 @@ export class AuthError extends Error {} export class CreditsError extends Error {} export class MonthlyLimitError extends Error {} +export class SubscriptionError extends Error { + retryAfter?: number + constructor(message: string, retryAfter?: number) { + super(message) + this.retryAfter = retryAfter + } +} export class UserLimitError extends Error {} export class ModelError extends Error {} export class RateLimitError extends Error {} diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index 8981ecac25ee..71dd6c009c88 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -8,11 +8,20 @@ import { Billing } from "@opencode-ai/console-core/billing.js" import { Actor } from "@opencode-ai/console-core/actor.js" import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" import { ZenData } from "@opencode-ai/console-core/model.js" +import { BlackData } from "@opencode-ai/console-core/black.js" import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js" import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js" import { logger } from "./logger" -import { AuthError, CreditsError, MonthlyLimitError, UserLimitError, ModelError, RateLimitError } from "./error" +import { + AuthError, + CreditsError, + MonthlyLimitError, + SubscriptionError, + UserLimitError, + ModelError, + RateLimitError, +} from "./error" import { createBodyConverter, createStreamPartConverter, createResponseConverter, UsageInfo } from "./provider/provider" import { anthropicHelper } from "./provider/anthropic" import { googleHelper } from "./provider/google" @@ -73,9 +82,9 @@ export async function handler( await rateLimiter?.check() const stickyTracker = createStickyTracker(modelInfo.stickyProvider ?? false, sessionId) const stickyProvider = await stickyTracker?.get() + const authInfo = await authenticate(modelInfo) const retriableRequest = async (retry: RetryOptions = { excludeProviders: [], retryCount: 0 }) => { - const authInfo = await authenticate(modelInfo) const providerInfo = selectProvider( zenData, authInfo, @@ -135,10 +144,10 @@ export async function handler( }) } - return { providerInfo, authInfo, reqBody, res, startTimestamp } + return { providerInfo, reqBody, res, startTimestamp } } - const { providerInfo, authInfo, reqBody, res, startTimestamp } = await retriableRequest() + const { providerInfo, reqBody, res, startTimestamp } = await retriableRequest() // Store model request dataDumper?.provideModel(providerInfo.storeModel) @@ -279,14 +288,19 @@ export async function handler( { status: 401 }, ) - if (error instanceof RateLimitError) + if (error instanceof RateLimitError || error instanceof SubscriptionError) { + const headers = new Headers() + if (error instanceof SubscriptionError && error.retryAfter) { + headers.set("retry-after", String(error.retryAfter)) + } return new Response( JSON.stringify({ type: "error", error: { type: error.constructor.name, message: error.message }, }), - { status: 429 }, + { status: 429, headers }, ) + } return new Response( JSON.stringify({ @@ -400,6 +414,13 @@ export async function handler( monthlyUsage: UserTable.monthlyUsage, timeMonthlyUsageUpdated: UserTable.timeMonthlyUsageUpdated, }, + subscription: { + timeSubscribed: UserTable.timeSubscribed, + subIntervalUsage: UserTable.subIntervalUsage, + subMonthlyUsage: UserTable.subMonthlyUsage, + timeSubIntervalUsageUpdated: UserTable.timeSubIntervalUsageUpdated, + timeSubMonthlyUsageUpdated: UserTable.timeSubMonthlyUsageUpdated, + }, provider: { credentials: ProviderTable.credentials, }, @@ -427,6 +448,7 @@ export async function handler( logger.metric({ api_key: data.apiKey, workspace: data.workspaceID, + isSubscription: data.subscription.timeSubscribed ? true : false, }) return { @@ -434,6 +456,7 @@ export async function handler( workspaceID: data.workspaceID, billing: data.billing, user: data.user, + subscription: data.subscription.timeSubscribed ? data.subscription : undefined, provider: data.provider, isFree: FREE_WORKSPACES.includes(data.workspaceID), isDisabled: !!data.timeDisabled, @@ -446,6 +469,64 @@ export async function handler( if (authInfo.isFree) return if (modelInfo.allowAnonymous) return + // Validate subscription billing + if (authInfo.subscription) { + const black = BlackData.get() + const sub = authInfo.subscription + const now = new Date() + + const formatRetryTime = (seconds: number) => { + const days = Math.floor(seconds / 86400) + if (days >= 1) return `${days} day${days > 1 ? "s" : ""}` + const hours = Math.floor(seconds / 3600) + const minutes = Math.ceil((seconds % 3600) / 60) + if (hours >= 1) return `${hours}hr ${minutes}min` + return `${minutes}min` + } + + // Check monthly limit (based on subscription billing cycle) + if ( + sub.subMonthlyUsage && + sub.timeSubMonthlyUsageUpdated && + sub.subMonthlyUsage >= centsToMicroCents(black.monthlyLimit * 100) + ) { + const subscribeDay = sub.timeSubscribed!.getUTCDate() + const cycleStart = new Date( + Date.UTC( + now.getUTCFullYear(), + now.getUTCDate() >= subscribeDay ? now.getUTCMonth() : now.getUTCMonth() - 1, + subscribeDay, + ), + ) + const cycleEnd = new Date(Date.UTC(cycleStart.getUTCFullYear(), cycleStart.getUTCMonth() + 1, subscribeDay)) + if (sub.timeSubMonthlyUsageUpdated >= cycleStart && sub.timeSubMonthlyUsageUpdated < cycleEnd) { + const retryAfter = Math.ceil((cycleEnd.getTime() - now.getTime()) / 1000) + throw new SubscriptionError( + `Subscription quota exceeded. Retry in ${formatRetryTime(retryAfter)}.`, + retryAfter, + ) + } + } + + // Check interval limit + const intervalMs = black.intervalLength * 3600 * 1000 + if (sub.subIntervalUsage && sub.timeSubIntervalUsageUpdated) { + const currentInterval = Math.floor(now.getTime() / intervalMs) + const usageInterval = Math.floor(sub.timeSubIntervalUsageUpdated.getTime() / intervalMs) + if (currentInterval === usageInterval && sub.subIntervalUsage >= centsToMicroCents(black.intervalLimit * 100)) { + const nextInterval = (currentInterval + 1) * intervalMs + const retryAfter = Math.ceil((nextInterval - now.getTime()) / 1000) + throw new SubscriptionError( + `Subscription quota exceeded. Retry in ${formatRetryTime(retryAfter)}.`, + retryAfter, + ) + } + } + + return + } + + // Validate pay as you go billing const billing = authInfo.billing if (!billing.paymentMethodID) throw new CreditsError( @@ -463,29 +544,25 @@ export async function handler( billing.monthlyLimit && billing.monthlyUsage && billing.timeMonthlyUsageUpdated && - billing.monthlyUsage >= centsToMicroCents(billing.monthlyLimit * 100) - ) { - const dateYear = billing.timeMonthlyUsageUpdated.getUTCFullYear() - const dateMonth = billing.timeMonthlyUsageUpdated.getUTCMonth() - if (currentYear === dateYear && currentMonth === dateMonth) - throw new MonthlyLimitError( - `Your workspace has reached its monthly spending limit of $${billing.monthlyLimit}. Manage your limits here: https://opencode.ai/workspace/${authInfo.workspaceID}/billing`, - ) - } + billing.monthlyUsage >= centsToMicroCents(billing.monthlyLimit * 100) && + currentYear === billing.timeMonthlyUsageUpdated.getUTCFullYear() && + currentMonth === billing.timeMonthlyUsageUpdated.getUTCMonth() + ) + throw new MonthlyLimitError( + `Your workspace has reached its monthly spending limit of $${billing.monthlyLimit}. Manage your limits here: https://opencode.ai/workspace/${authInfo.workspaceID}/billing`, + ) if ( authInfo.user.monthlyLimit && authInfo.user.monthlyUsage && authInfo.user.timeMonthlyUsageUpdated && - authInfo.user.monthlyUsage >= centsToMicroCents(authInfo.user.monthlyLimit * 100) - ) { - const dateYear = authInfo.user.timeMonthlyUsageUpdated.getUTCFullYear() - const dateMonth = authInfo.user.timeMonthlyUsageUpdated.getUTCMonth() - if (currentYear === dateYear && currentMonth === dateMonth) - throw new UserLimitError( - `You have reached your monthly spending limit of $${authInfo.user.monthlyLimit}. Manage your limits here: https://opencode.ai/workspace/${authInfo.workspaceID}/members`, - ) - } + authInfo.user.monthlyUsage >= centsToMicroCents(authInfo.user.monthlyLimit * 100) && + currentYear === authInfo.user.timeMonthlyUsageUpdated.getUTCFullYear() && + currentMonth === authInfo.user.timeMonthlyUsageUpdated.getUTCMonth() + ) + throw new UserLimitError( + `You have reached your monthly spending limit of $${authInfo.user.monthlyLimit}. Manage your limits here: https://opencode.ai/workspace/${authInfo.workspaceID}/members`, + ) } function validateModelSettings(authInfo: AuthInfo) { @@ -560,7 +637,7 @@ export async function handler( if (!authInfo) return - const cost = authInfo.isFree || authInfo.provider?.credentials ? 0 : centsToMicroCents(totalCostInCent) + const cost = authInfo.provider?.credentials ? 0 : centsToMicroCents(totalCostInCent) await Database.use((db) => Promise.all([ db.insert(UsageTable).values({ @@ -576,36 +653,77 @@ export async function handler( cacheWrite1hTokens, cost, keyID: authInfo.apiKeyId, + enrichment: authInfo.subscription ? { plan: "sub" } : undefined, }), db - .update(BillingTable) - .set({ - balance: sql`${BillingTable.balance} - ${cost}`, - monthlyUsage: sql` + .update(KeyTable) + .set({ timeUsed: sql`now()` }) + .where(and(eq(KeyTable.workspaceID, authInfo.workspaceID), eq(KeyTable.id, authInfo.apiKeyId))), + ...(authInfo.subscription + ? (() => { + const now = new Date() + const subscribeDay = authInfo.subscription.timeSubscribed!.getUTCDate() + const cycleStart = new Date( + Date.UTC( + now.getUTCFullYear(), + now.getUTCDate() >= subscribeDay ? now.getUTCMonth() : now.getUTCMonth() - 1, + subscribeDay, + ), + ) + const cycleEnd = new Date( + Date.UTC(cycleStart.getUTCFullYear(), cycleStart.getUTCMonth() + 1, subscribeDay), + ) + return [ + db + .update(UserTable) + .set({ + subMonthlyUsage: sql` + CASE + WHEN ${UserTable.timeSubMonthlyUsageUpdated} >= ${cycleStart} AND ${UserTable.timeSubMonthlyUsageUpdated} < ${cycleEnd} THEN ${UserTable.subMonthlyUsage} + ${cost} + ELSE ${cost} + END + `, + timeSubMonthlyUsageUpdated: sql`now()`, + subIntervalUsage: sql` + CASE + WHEN FLOOR(UNIX_TIMESTAMP(${UserTable.timeSubIntervalUsageUpdated}) / (${BlackData.get().intervalLength} * 3600)) = FLOOR(UNIX_TIMESTAMP(now()) / (${BlackData.get().intervalLength} * 3600)) THEN ${UserTable.subIntervalUsage} + ${cost} + ELSE ${cost} + END + `, + timeSubIntervalUsageUpdated: sql`now()`, + }) + .where(and(eq(UserTable.workspaceID, authInfo.workspaceID), eq(UserTable.id, authInfo.user.id))), + ] + })() + : [ + db + .update(BillingTable) + .set({ + balance: authInfo.isFree + ? sql`${BillingTable.balance} - ${0}` + : sql`${BillingTable.balance} - ${cost}`, + monthlyUsage: sql` CASE WHEN MONTH(${BillingTable.timeMonthlyUsageUpdated}) = MONTH(now()) AND YEAR(${BillingTable.timeMonthlyUsageUpdated}) = YEAR(now()) THEN ${BillingTable.monthlyUsage} + ${cost} ELSE ${cost} END `, - timeMonthlyUsageUpdated: sql`now()`, - }) - .where(eq(BillingTable.workspaceID, authInfo.workspaceID)), - db - .update(UserTable) - .set({ - monthlyUsage: sql` + timeMonthlyUsageUpdated: sql`now()`, + }) + .where(eq(BillingTable.workspaceID, authInfo.workspaceID)), + db + .update(UserTable) + .set({ + monthlyUsage: sql` CASE WHEN MONTH(${UserTable.timeMonthlyUsageUpdated}) = MONTH(now()) AND YEAR(${UserTable.timeMonthlyUsageUpdated}) = YEAR(now()) THEN ${UserTable.monthlyUsage} + ${cost} ELSE ${cost} END `, - timeMonthlyUsageUpdated: sql`now()`, - }) - .where(and(eq(UserTable.workspaceID, authInfo.workspaceID), eq(UserTable.id, authInfo.user.id))), - db - .update(KeyTable) - .set({ timeUsed: sql`now()` }) - .where(and(eq(KeyTable.workspaceID, authInfo.workspaceID), eq(KeyTable.id, authInfo.apiKeyId))), + timeMonthlyUsageUpdated: sql`now()`, + }) + .where(and(eq(UserTable.workspaceID, authInfo.workspaceID), eq(UserTable.id, authInfo.user.id))), + ]), ]), ) @@ -616,6 +734,7 @@ export async function handler( if (!authInfo) return if (authInfo.isFree) return if (authInfo.provider?.credentials) return + if (authInfo.subscription) return if (!costInfo) return diff --git a/packages/console/core/migrations/0042_flat_nightmare.sql b/packages/console/core/migrations/0042_flat_nightmare.sql new file mode 100644 index 000000000000..666988edc612 --- /dev/null +++ b/packages/console/core/migrations/0042_flat_nightmare.sql @@ -0,0 +1,7 @@ +ALTER TABLE `billing` ADD `subscription_id` varchar(28);--> statement-breakpoint +ALTER TABLE `usage` ADD `data` json;--> statement-breakpoint +ALTER TABLE `user` ADD `time_subscribed` timestamp(3);--> statement-breakpoint +ALTER TABLE `user` ADD `sub_recent_usage` bigint;--> statement-breakpoint +ALTER TABLE `user` ADD `sub_monthly_usage` bigint;--> statement-breakpoint +ALTER TABLE `user` ADD `sub_time_recent_usage_updated` timestamp(3);--> statement-breakpoint +ALTER TABLE `user` ADD `sub_time_monthly_usage_updated` timestamp(3); \ No newline at end of file diff --git a/packages/console/core/migrations/0043_lame_calypso.sql b/packages/console/core/migrations/0043_lame_calypso.sql new file mode 100644 index 000000000000..9a2facbc4fe2 --- /dev/null +++ b/packages/console/core/migrations/0043_lame_calypso.sql @@ -0,0 +1,2 @@ +ALTER TABLE `user` RENAME COLUMN `sub_recent_usage` TO `sub_interval_usage`;--> statement-breakpoint +ALTER TABLE `user` RENAME COLUMN `sub_time_recent_usage_updated` TO `sub_time_interval_usage_updated`; \ No newline at end of file diff --git a/packages/console/core/migrations/0044_tiny_captain_midlands.sql b/packages/console/core/migrations/0044_tiny_captain_midlands.sql new file mode 100644 index 000000000000..07163dd6524a --- /dev/null +++ b/packages/console/core/migrations/0044_tiny_captain_midlands.sql @@ -0,0 +1 @@ +ALTER TABLE `usage` RENAME COLUMN `data` TO `enrichment`; \ No newline at end of file diff --git a/packages/console/core/migrations/0045_cuddly_diamondback.sql b/packages/console/core/migrations/0045_cuddly_diamondback.sql new file mode 100644 index 000000000000..476e6bfe8a27 --- /dev/null +++ b/packages/console/core/migrations/0045_cuddly_diamondback.sql @@ -0,0 +1 @@ +ALTER TABLE `billing` ADD CONSTRAINT `global_subscription_id` UNIQUE(`subscription_id`); \ No newline at end of file diff --git a/packages/console/core/migrations/meta/0042_snapshot.json b/packages/console/core/migrations/meta/0042_snapshot.json new file mode 100644 index 000000000000..e0f731e39756 --- /dev/null +++ b/packages/console/core/migrations/meta/0042_snapshot.json @@ -0,0 +1,1144 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "4775571c-ad9c-4104-a202-2374b1963cfe", + "prevId": "9cf10c24-6029-4cb4-866e-ff9b501eaf7e", + "tables": { + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "account_id_pk": { + "name": "account_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "auth": { + "name": "auth", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "enum('email','github','google')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "provider": { + "name": "provider", + "columns": ["provider", "subject"], + "isUnique": true + }, + "account_id": { + "name": "account_id", + "columns": ["account_id"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_id_pk": { + "name": "auth_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "benchmark": { + "name": "benchmark", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "agent": { + "name": "agent", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "result": { + "name": "result", + "type": "mediumtext", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "time_created": { + "name": "time_created", + "columns": ["time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "benchmark_id_pk": { + "name": "benchmark_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "billing": { + "name": "billing", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_id": { + "name": "payment_method_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_type": { + "name": "payment_method_type", + "type": "varchar(32)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_last4": { + "name": "payment_method_last4", + "type": "varchar(4)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload": { + "name": "reload", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_trigger": { + "name": "reload_trigger", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_amount": { + "name": "reload_amount", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_error": { + "name": "reload_error", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_error": { + "name": "time_reload_error", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_locked_till": { + "name": "time_reload_locked_till", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_id": { + "name": "subscription_id", + "type": "varchar(28)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_customer_id": { + "name": "global_customer_id", + "columns": ["customer_id"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "billing_workspace_id_id_pk": { + "name": "billing_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "payment": { + "name": "payment", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoice_id": { + "name": "invoice_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_id": { + "name": "payment_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_refunded": { + "name": "time_refunded", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "payment_workspace_id_id_pk": { + "name": "payment_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "usage": { + "name": "usage", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reasoning_tokens": { + "name": "reasoning_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_read_tokens": { + "name": "cache_read_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_5m_tokens": { + "name": "cache_write_5m_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_1h_tokens": { + "name": "cache_write_1h_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_id": { + "name": "key_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "usage_time_created": { + "name": "usage_time_created", + "columns": ["workspace_id", "time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "usage_workspace_id_id_pk": { + "name": "usage_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip_rate_limit": { + "name": "ip_rate_limit", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "interval": { + "name": "interval", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_rate_limit_ip_interval_pk": { + "name": "ip_rate_limit_ip_interval_pk", + "columns": ["ip", "interval"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip": { + "name": "ip", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage": { + "name": "usage", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_ip_pk": { + "name": "ip_ip_pk", + "columns": ["ip"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "key": { + "name": "key", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_used": { + "name": "time_used", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_key": { + "name": "global_key", + "columns": ["key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "key_workspace_id_id_pk": { + "name": "key_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "model": { + "name": "model", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "model_workspace_model": { + "name": "model_workspace_model", + "columns": ["workspace_id", "model"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "model_workspace_id_id_pk": { + "name": "model_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "provider": { + "name": "provider", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credentials": { + "name": "credentials", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "workspace_provider": { + "name": "workspace_provider", + "columns": ["workspace_id", "provider"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "provider_workspace_id_id_pk": { + "name": "provider_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_seen": { + "name": "time_seen", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('admin','member')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_subscribed": { + "name": "time_subscribed", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_recent_usage": { + "name": "sub_recent_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_monthly_usage": { + "name": "sub_monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_recent_usage_updated": { + "name": "sub_time_recent_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_monthly_usage_updated": { + "name": "sub_time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_account_id": { + "name": "user_account_id", + "columns": ["workspace_id", "account_id"], + "isUnique": true + }, + "user_email": { + "name": "user_email", + "columns": ["workspace_id", "email"], + "isUnique": true + }, + "global_account_id": { + "name": "global_account_id", + "columns": ["account_id"], + "isUnique": false + }, + "global_email": { + "name": "global_email", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_workspace_id_id_pk": { + "name": "user_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "workspace": { + "name": "workspace", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "slug": { + "name": "slug", + "columns": ["slug"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "workspace_id": { + "name": "workspace_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/console/core/migrations/meta/0043_snapshot.json b/packages/console/core/migrations/meta/0043_snapshot.json new file mode 100644 index 000000000000..ef9caa74e6b0 --- /dev/null +++ b/packages/console/core/migrations/meta/0043_snapshot.json @@ -0,0 +1,1147 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "3ff862f3-eeb6-4b10-8c78-254de3778ab3", + "prevId": "4775571c-ad9c-4104-a202-2374b1963cfe", + "tables": { + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "account_id_pk": { + "name": "account_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "auth": { + "name": "auth", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "enum('email','github','google')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "provider": { + "name": "provider", + "columns": ["provider", "subject"], + "isUnique": true + }, + "account_id": { + "name": "account_id", + "columns": ["account_id"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_id_pk": { + "name": "auth_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "benchmark": { + "name": "benchmark", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "agent": { + "name": "agent", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "result": { + "name": "result", + "type": "mediumtext", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "time_created": { + "name": "time_created", + "columns": ["time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "benchmark_id_pk": { + "name": "benchmark_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "billing": { + "name": "billing", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_id": { + "name": "payment_method_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_type": { + "name": "payment_method_type", + "type": "varchar(32)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_last4": { + "name": "payment_method_last4", + "type": "varchar(4)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload": { + "name": "reload", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_trigger": { + "name": "reload_trigger", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_amount": { + "name": "reload_amount", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_error": { + "name": "reload_error", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_error": { + "name": "time_reload_error", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_locked_till": { + "name": "time_reload_locked_till", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_id": { + "name": "subscription_id", + "type": "varchar(28)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_customer_id": { + "name": "global_customer_id", + "columns": ["customer_id"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "billing_workspace_id_id_pk": { + "name": "billing_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "payment": { + "name": "payment", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoice_id": { + "name": "invoice_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_id": { + "name": "payment_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_refunded": { + "name": "time_refunded", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "payment_workspace_id_id_pk": { + "name": "payment_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "usage": { + "name": "usage", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reasoning_tokens": { + "name": "reasoning_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_read_tokens": { + "name": "cache_read_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_5m_tokens": { + "name": "cache_write_5m_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_1h_tokens": { + "name": "cache_write_1h_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_id": { + "name": "key_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "usage_time_created": { + "name": "usage_time_created", + "columns": ["workspace_id", "time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "usage_workspace_id_id_pk": { + "name": "usage_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip_rate_limit": { + "name": "ip_rate_limit", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "interval": { + "name": "interval", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_rate_limit_ip_interval_pk": { + "name": "ip_rate_limit_ip_interval_pk", + "columns": ["ip", "interval"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip": { + "name": "ip", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage": { + "name": "usage", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_ip_pk": { + "name": "ip_ip_pk", + "columns": ["ip"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "key": { + "name": "key", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_used": { + "name": "time_used", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_key": { + "name": "global_key", + "columns": ["key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "key_workspace_id_id_pk": { + "name": "key_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "model": { + "name": "model", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "model_workspace_model": { + "name": "model_workspace_model", + "columns": ["workspace_id", "model"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "model_workspace_id_id_pk": { + "name": "model_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "provider": { + "name": "provider", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credentials": { + "name": "credentials", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "workspace_provider": { + "name": "workspace_provider", + "columns": ["workspace_id", "provider"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "provider_workspace_id_id_pk": { + "name": "provider_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_seen": { + "name": "time_seen", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('admin','member')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_subscribed": { + "name": "time_subscribed", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_interval_usage": { + "name": "sub_interval_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_monthly_usage": { + "name": "sub_monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_interval_usage_updated": { + "name": "sub_time_interval_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_monthly_usage_updated": { + "name": "sub_time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_account_id": { + "name": "user_account_id", + "columns": ["workspace_id", "account_id"], + "isUnique": true + }, + "user_email": { + "name": "user_email", + "columns": ["workspace_id", "email"], + "isUnique": true + }, + "global_account_id": { + "name": "global_account_id", + "columns": ["account_id"], + "isUnique": false + }, + "global_email": { + "name": "global_email", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_workspace_id_id_pk": { + "name": "user_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "workspace": { + "name": "workspace", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "slug": { + "name": "slug", + "columns": ["slug"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "workspace_id": { + "name": "workspace_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": { + "\"user\".\"sub_recent_usage\"": "\"user\".\"sub_interval_usage\"", + "\"user\".\"sub_time_recent_usage_updated\"": "\"user\".\"sub_time_interval_usage_updated\"" + } + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/console/core/migrations/meta/0044_snapshot.json b/packages/console/core/migrations/meta/0044_snapshot.json new file mode 100644 index 000000000000..cde7fabf228d --- /dev/null +++ b/packages/console/core/migrations/meta/0044_snapshot.json @@ -0,0 +1,1146 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "70394850-2c28-4012-a3d5-69357e3348b6", + "prevId": "3ff862f3-eeb6-4b10-8c78-254de3778ab3", + "tables": { + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "account_id_pk": { + "name": "account_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "auth": { + "name": "auth", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "enum('email','github','google')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "provider": { + "name": "provider", + "columns": ["provider", "subject"], + "isUnique": true + }, + "account_id": { + "name": "account_id", + "columns": ["account_id"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_id_pk": { + "name": "auth_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "benchmark": { + "name": "benchmark", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "agent": { + "name": "agent", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "result": { + "name": "result", + "type": "mediumtext", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "time_created": { + "name": "time_created", + "columns": ["time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "benchmark_id_pk": { + "name": "benchmark_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "billing": { + "name": "billing", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_id": { + "name": "payment_method_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_type": { + "name": "payment_method_type", + "type": "varchar(32)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_last4": { + "name": "payment_method_last4", + "type": "varchar(4)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload": { + "name": "reload", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_trigger": { + "name": "reload_trigger", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_amount": { + "name": "reload_amount", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_error": { + "name": "reload_error", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_error": { + "name": "time_reload_error", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_locked_till": { + "name": "time_reload_locked_till", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_id": { + "name": "subscription_id", + "type": "varchar(28)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_customer_id": { + "name": "global_customer_id", + "columns": ["customer_id"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "billing_workspace_id_id_pk": { + "name": "billing_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "payment": { + "name": "payment", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoice_id": { + "name": "invoice_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_id": { + "name": "payment_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_refunded": { + "name": "time_refunded", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "payment_workspace_id_id_pk": { + "name": "payment_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "usage": { + "name": "usage", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reasoning_tokens": { + "name": "reasoning_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_read_tokens": { + "name": "cache_read_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_5m_tokens": { + "name": "cache_write_5m_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_1h_tokens": { + "name": "cache_write_1h_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_id": { + "name": "key_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enrichment": { + "name": "enrichment", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "usage_time_created": { + "name": "usage_time_created", + "columns": ["workspace_id", "time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "usage_workspace_id_id_pk": { + "name": "usage_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip_rate_limit": { + "name": "ip_rate_limit", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "interval": { + "name": "interval", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_rate_limit_ip_interval_pk": { + "name": "ip_rate_limit_ip_interval_pk", + "columns": ["ip", "interval"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip": { + "name": "ip", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage": { + "name": "usage", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_ip_pk": { + "name": "ip_ip_pk", + "columns": ["ip"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "key": { + "name": "key", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_used": { + "name": "time_used", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_key": { + "name": "global_key", + "columns": ["key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "key_workspace_id_id_pk": { + "name": "key_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "model": { + "name": "model", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "model_workspace_model": { + "name": "model_workspace_model", + "columns": ["workspace_id", "model"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "model_workspace_id_id_pk": { + "name": "model_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "provider": { + "name": "provider", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credentials": { + "name": "credentials", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "workspace_provider": { + "name": "workspace_provider", + "columns": ["workspace_id", "provider"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "provider_workspace_id_id_pk": { + "name": "provider_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_seen": { + "name": "time_seen", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('admin','member')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_subscribed": { + "name": "time_subscribed", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_interval_usage": { + "name": "sub_interval_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_monthly_usage": { + "name": "sub_monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_interval_usage_updated": { + "name": "sub_time_interval_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_monthly_usage_updated": { + "name": "sub_time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_account_id": { + "name": "user_account_id", + "columns": ["workspace_id", "account_id"], + "isUnique": true + }, + "user_email": { + "name": "user_email", + "columns": ["workspace_id", "email"], + "isUnique": true + }, + "global_account_id": { + "name": "global_account_id", + "columns": ["account_id"], + "isUnique": false + }, + "global_email": { + "name": "global_email", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_workspace_id_id_pk": { + "name": "user_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "workspace": { + "name": "workspace", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "slug": { + "name": "slug", + "columns": ["slug"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "workspace_id": { + "name": "workspace_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": { + "\"usage\".\"data\"": "\"usage\".\"enrichment\"" + } + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/console/core/migrations/meta/0045_snapshot.json b/packages/console/core/migrations/meta/0045_snapshot.json new file mode 100644 index 000000000000..6ab9760c6808 --- /dev/null +++ b/packages/console/core/migrations/meta/0045_snapshot.json @@ -0,0 +1,1149 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "27c1a3eb-b125-46d4-b436-abe5764fe4b7", + "prevId": "70394850-2c28-4012-a3d5-69357e3348b6", + "tables": { + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "account_id_pk": { + "name": "account_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "auth": { + "name": "auth", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "enum('email','github','google')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "subject": { + "name": "subject", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "provider": { + "name": "provider", + "columns": ["provider", "subject"], + "isUnique": true + }, + "account_id": { + "name": "account_id", + "columns": ["account_id"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_id_pk": { + "name": "auth_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "benchmark": { + "name": "benchmark", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "agent": { + "name": "agent", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "result": { + "name": "result", + "type": "mediumtext", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "time_created": { + "name": "time_created", + "columns": ["time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "benchmark_id_pk": { + "name": "benchmark_id_pk", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "billing": { + "name": "billing", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_id": { + "name": "payment_method_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_type": { + "name": "payment_method_type", + "type": "varchar(32)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_last4": { + "name": "payment_method_last4", + "type": "varchar(4)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload": { + "name": "reload", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_trigger": { + "name": "reload_trigger", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_amount": { + "name": "reload_amount", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_error": { + "name": "reload_error", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_error": { + "name": "time_reload_error", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_locked_till": { + "name": "time_reload_locked_till", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_id": { + "name": "subscription_id", + "type": "varchar(28)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_customer_id": { + "name": "global_customer_id", + "columns": ["customer_id"], + "isUnique": true + }, + "global_subscription_id": { + "name": "global_subscription_id", + "columns": ["subscription_id"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "billing_workspace_id_id_pk": { + "name": "billing_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "payment": { + "name": "payment", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoice_id": { + "name": "invoice_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_id": { + "name": "payment_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_refunded": { + "name": "time_refunded", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "payment_workspace_id_id_pk": { + "name": "payment_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "usage": { + "name": "usage", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reasoning_tokens": { + "name": "reasoning_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_read_tokens": { + "name": "cache_read_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_5m_tokens": { + "name": "cache_write_5m_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_1h_tokens": { + "name": "cache_write_1h_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key_id": { + "name": "key_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "enrichment": { + "name": "enrichment", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "usage_time_created": { + "name": "usage_time_created", + "columns": ["workspace_id", "time_created"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "usage_workspace_id_id_pk": { + "name": "usage_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip_rate_limit": { + "name": "ip_rate_limit", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "interval": { + "name": "interval", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_rate_limit_ip_interval_pk": { + "name": "ip_rate_limit_ip_interval_pk", + "columns": ["ip", "interval"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "ip": { + "name": "ip", + "columns": { + "ip": { + "name": "ip", + "type": "varchar(45)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "usage": { + "name": "usage", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ip_ip_pk": { + "name": "ip_ip_pk", + "columns": ["ip"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "key": { + "name": "key", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_used": { + "name": "time_used", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_key": { + "name": "global_key", + "columns": ["key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "key_workspace_id_id_pk": { + "name": "key_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "model": { + "name": "model", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "model_workspace_model": { + "name": "model_workspace_model", + "columns": ["workspace_id", "model"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "model_workspace_id_id_pk": { + "name": "model_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "provider": { + "name": "provider", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "credentials": { + "name": "credentials", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "workspace_provider": { + "name": "workspace_provider", + "columns": ["workspace_id", "provider"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "provider_workspace_id_id_pk": { + "name": "provider_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_seen": { + "name": "time_seen", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "enum('admin','member')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_subscribed": { + "name": "time_subscribed", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_interval_usage": { + "name": "sub_interval_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_monthly_usage": { + "name": "sub_monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_interval_usage_updated": { + "name": "sub_time_interval_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sub_time_monthly_usage_updated": { + "name": "sub_time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_account_id": { + "name": "user_account_id", + "columns": ["workspace_id", "account_id"], + "isUnique": true + }, + "user_email": { + "name": "user_email", + "columns": ["workspace_id", "email"], + "isUnique": true + }, + "global_account_id": { + "name": "global_account_id", + "columns": ["account_id"], + "isUnique": false + }, + "global_email": { + "name": "global_email", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_workspace_id_id_pk": { + "name": "user_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "workspace": { + "name": "workspace", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "slug": { + "name": "slug", + "columns": ["slug"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "workspace_id": { + "name": "workspace_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/console/core/migrations/meta/_journal.json b/packages/console/core/migrations/meta/_journal.json index 4b68600bf479..7925a46a5d8d 100644 --- a/packages/console/core/migrations/meta/_journal.json +++ b/packages/console/core/migrations/meta/_journal.json @@ -295,6 +295,34 @@ "when": 1767732559197, "tag": "0041_odd_misty_knight", "breakpoints": true + }, + { + "idx": 42, + "version": "5", + "when": 1767744077346, + "tag": "0042_flat_nightmare", + "breakpoints": true + }, + { + "idx": 43, + "version": "5", + "when": 1767752636118, + "tag": "0043_lame_calypso", + "breakpoints": true + }, + { + "idx": 44, + "version": "5", + "when": 1767759322451, + "tag": "0044_tiny_captain_midlands", + "breakpoints": true + }, + { + "idx": 45, + "version": "5", + "when": 1767765497502, + "tag": "0045_cuddly_diamondback", + "breakpoints": true } ] } diff --git a/packages/console/core/package.json b/packages/console/core/package.json index c22276bf0550..258a31c161a7 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/console-core", - "version": "1.1.4", + "version": "1.1.6", "private": true, "type": "module", "license": "MIT", @@ -32,6 +32,9 @@ "promote-models-to-dev": "script/promote-models.ts dev", "promote-models-to-prod": "script/promote-models.ts production", "pull-models-from-dev": "script/pull-models.ts dev", + "update-black": "script/update-black.ts", + "promote-black-to-dev": "script/promote-black.ts dev", + "promote-black-to-prod": "script/promote-black.ts production", "typecheck": "tsgo --noEmit" }, "devDependencies": { diff --git a/packages/console/core/script/onboard-zen-black.ts b/packages/console/core/script/onboard-zen-black.ts new file mode 100644 index 000000000000..15418af2fca9 --- /dev/null +++ b/packages/console/core/script/onboard-zen-black.ts @@ -0,0 +1,166 @@ +import { Billing } from "../src/billing.js" +import { Database, eq, and, sql } from "../src/drizzle/index.js" +import { AuthTable } from "../src/schema/auth.sql.js" +import { UserTable } from "../src/schema/user.sql.js" +import { BillingTable, PaymentTable } from "../src/schema/billing.sql.js" +import { Identifier } from "../src/identifier.js" +import { centsToMicroCents } from "../src/util/price.js" + +const workspaceID = process.argv[2] +const email = process.argv[3] + +if (!workspaceID || !email) { + console.error("Usage: bun onboard-zen-black.ts ") + process.exit(1) +} + +// Look up the Stripe customer by email +const customers = await Billing.stripe().customers.list({ email, limit: 1 }) +const customer = customers.data[0] +if (!customer) { + console.error(`Error: No Stripe customer found for email ${email}`) + process.exit(1) +} +const customerID = customer.id + +// Get the subscription id +const subscriptions = await Billing.stripe().subscriptions.list({ customer: customerID, limit: 1 }) +const subscription = subscriptions.data[0] +if (!subscription) { + console.error(`Error: Customer ${customerID} does not have a subscription`) + process.exit(1) +} +const subscriptionID = subscription.id + +// Validate the subscription is $200 +const amountInCents = subscription.items.data[0]?.price.unit_amount ?? 0 +if (amountInCents !== 20000) { + console.error(`Error: Subscription amount is $${amountInCents / 100}, expected $200`) + process.exit(1) +} + +// Check if subscription is already tied to another workspace +const existingSubscription = await Database.use((tx) => + tx + .select({ workspaceID: BillingTable.workspaceID }) + .from(BillingTable) + .where(eq(BillingTable.subscriptionID, subscriptionID)) + .then((rows) => rows[0]), +) +if (existingSubscription) { + console.error( + `Error: Subscription ${subscriptionID} is already tied to workspace ${existingSubscription.workspaceID}`, + ) + process.exit(1) +} + +// Look up the workspace billing and check if it already has a customer id or subscription +const billing = await Database.use((tx) => + tx + .select({ customerID: BillingTable.customerID, subscriptionID: BillingTable.subscriptionID }) + .from(BillingTable) + .where(eq(BillingTable.workspaceID, workspaceID)) + .then((rows) => rows[0]), +) +if (billing?.subscriptionID) { + console.error(`Error: Workspace ${workspaceID} already has a subscription: ${billing.subscriptionID}`) + process.exit(1) +} +if (billing?.customerID) { + console.warn( + `Warning: Workspace ${workspaceID} already has a customer id: ${billing.customerID}, replacing with ${customerID}`, + ) +} + +// Get the latest invoice and payment from the subscription +const invoices = await Billing.stripe().invoices.list({ + subscription: subscriptionID, + limit: 1, + expand: ["data.payments"], +}) +const invoice = invoices.data[0] +const invoiceID = invoice?.id +const paymentID = invoice?.payments?.data[0]?.payment.payment_intent as string | undefined + +// Get the default payment method from the customer +const paymentMethodID = (customer.invoice_settings.default_payment_method ?? subscription.default_payment_method) as + | string + | null +const paymentMethod = paymentMethodID ? await Billing.stripe().paymentMethods.retrieve(paymentMethodID) : null +const paymentMethodLast4 = paymentMethod?.card?.last4 ?? null +const paymentMethodType = paymentMethod?.type ?? null + +// Look up the user by email via AuthTable +const auth = await Database.use((tx) => + tx + .select({ accountID: AuthTable.accountID }) + .from(AuthTable) + .where(and(eq(AuthTable.provider, "email"), eq(AuthTable.subject, email))) + .then((rows) => rows[0]), +) +if (!auth) { + console.error(`Error: No user found with email ${email}`) + process.exit(1) +} + +// Look up the user in the workspace +const user = await Database.use((tx) => + tx + .select({ id: UserTable.id }) + .from(UserTable) + .where(and(eq(UserTable.workspaceID, workspaceID), eq(UserTable.accountID, auth.accountID))) + .then((rows) => rows[0]), +) +if (!user) { + console.error(`Error: User with email ${email} is not a member of workspace ${workspaceID}`) + process.exit(1) +} + +// Set workspaceID in Stripe customer metadata +await Billing.stripe().customers.update(customerID, { + metadata: { + workspaceID, + }, +}) + +await Database.transaction(async (tx) => { + // Set customer id, subscription id, and payment method on workspace billing + await tx + .update(BillingTable) + .set({ + customerID, + subscriptionID, + paymentMethodID, + paymentMethodLast4, + paymentMethodType, + }) + .where(eq(BillingTable.workspaceID, workspaceID)) + + // Set current time as timeSubscribed on user + await tx + .update(UserTable) + .set({ + timeSubscribed: sql`now()`, + }) + .where(eq(UserTable.id, user.id)) + + // Create a row in payments table + await tx.insert(PaymentTable).values({ + workspaceID, + id: Identifier.create("payment"), + amount: centsToMicroCents(amountInCents), + customerID, + invoiceID, + paymentID, + }) +}) + +console.log(`Successfully onboarded workspace ${workspaceID}`) +console.log(` Customer ID: ${customerID}`) +console.log(` Subscription ID: ${subscriptionID}`) +console.log( + ` Payment Method: ${paymentMethodID ?? "(none)"} (${paymentMethodType ?? "unknown"} ending in ${paymentMethodLast4 ?? "????"})`, +) +console.log(` User ID: ${user.id}`) +console.log(` Invoice ID: ${invoiceID ?? "(none)"}`) +console.log(` Payment ID: ${paymentID ?? "(none)"}`) diff --git a/packages/console/core/script/promote-black.ts b/packages/console/core/script/promote-black.ts new file mode 100755 index 000000000000..bb3dcc6f7b6e --- /dev/null +++ b/packages/console/core/script/promote-black.ts @@ -0,0 +1,22 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import path from "path" +import { BlackData } from "../src/black" + +const stage = process.argv[2] +if (!stage) throw new Error("Stage is required") + +const root = path.resolve(process.cwd(), "..", "..", "..") + +// read the secret +const ret = await $`bun sst secret list`.cwd(root).text() +const lines = ret.split("\n") +const value = lines.find((line) => line.startsWith("ZEN_BLACK"))?.split("=")[1] +if (!value) throw new Error("ZEN_BLACK not found") + +// validate value +BlackData.validate(JSON.parse(value)) + +// update the secret +await $`bun sst secret set ZEN_BLACK ${value} --stage ${stage}` diff --git a/packages/console/core/script/update-black.ts b/packages/console/core/script/update-black.ts new file mode 100755 index 000000000000..58923b457dda --- /dev/null +++ b/packages/console/core/script/update-black.ts @@ -0,0 +1,28 @@ +#!/usr/bin/env bun + +import { $ } from "bun" +import path from "path" +import os from "os" +import { BlackData } from "../src/black" + +const root = path.resolve(process.cwd(), "..", "..", "..") +const secrets = await $`bun sst secret list`.cwd(root).text() + +// read the line starting with "ZEN_BLACK" +const lines = secrets.split("\n") +const oldValue = lines.find((line) => line.startsWith("ZEN_BLACK"))?.split("=")[1] +if (!oldValue) throw new Error("ZEN_BLACK not found") + +// store the prettified json to a temp file +const filename = `black-${Date.now()}.json` +const tempFile = Bun.file(path.join(os.tmpdir(), filename)) +await tempFile.write(JSON.stringify(JSON.parse(oldValue), null, 2)) +console.log("tempFile", tempFile.name) + +// open temp file in vim and read the file on close +await $`vim ${tempFile.name}` +const newValue = JSON.stringify(JSON.parse(await tempFile.text())) +BlackData.validate(JSON.parse(newValue)) + +// update the secret +await $`bun sst secret set ZEN_BLACK ${newValue}` diff --git a/packages/console/core/src/billing.ts b/packages/console/core/src/billing.ts index c14df11ae7db..c97dfff1ba16 100644 --- a/packages/console/core/src/billing.ts +++ b/packages/console/core/src/billing.ts @@ -27,6 +27,7 @@ export namespace Billing { tx .select({ customerID: BillingTable.customerID, + subscriptionID: BillingTable.subscriptionID, paymentMethodID: BillingTable.paymentMethodID, paymentMethodType: BillingTable.paymentMethodType, paymentMethodLast4: BillingTable.paymentMethodLast4, diff --git a/packages/console/core/src/black.ts b/packages/console/core/src/black.ts new file mode 100644 index 000000000000..a4c44aea56e0 --- /dev/null +++ b/packages/console/core/src/black.ts @@ -0,0 +1,20 @@ +import { z } from "zod" +import { fn } from "./util/fn" +import { Resource } from "@opencode-ai/console-resource" + +export namespace BlackData { + const Schema = z.object({ + monthlyLimit: z.number().int(), + intervalLimit: z.number().int(), + intervalLength: z.number().int(), + }) + + export const validate = fn(Schema, (input) => { + return input + }) + + export const get = fn(z.void(), () => { + const json = JSON.parse(Resource.ZEN_BLACK.value) + return Schema.parse(json) + }) +} diff --git a/packages/console/core/src/schema/billing.sql.ts b/packages/console/core/src/schema/billing.sql.ts index 17cdd871d3db..42da13776914 100644 --- a/packages/console/core/src/schema/billing.sql.ts +++ b/packages/console/core/src/schema/billing.sql.ts @@ -1,4 +1,4 @@ -import { bigint, boolean, index, int, mysqlTable, uniqueIndex, varchar } from "drizzle-orm/mysql-core" +import { bigint, boolean, index, int, json, mysqlTable, uniqueIndex, varchar } from "drizzle-orm/mysql-core" import { timestamps, ulid, utc, workspaceColumns } from "../drizzle/types" import { workspaceIndexes } from "./workspace.sql" @@ -21,8 +21,13 @@ export const BillingTable = mysqlTable( reloadError: varchar("reload_error", { length: 255 }), timeReloadError: utc("time_reload_error"), timeReloadLockedTill: utc("time_reload_locked_till"), + subscriptionID: varchar("subscription_id", { length: 28 }), }, - (table) => [...workspaceIndexes(table), uniqueIndex("global_customer_id").on(table.customerID)], + (table) => [ + ...workspaceIndexes(table), + uniqueIndex("global_customer_id").on(table.customerID), + uniqueIndex("global_subscription_id").on(table.subscriptionID), + ], ) export const PaymentTable = mysqlTable( @@ -54,6 +59,9 @@ export const UsageTable = mysqlTable( cacheWrite1hTokens: int("cache_write_1h_tokens"), cost: bigint("cost", { mode: "number" }).notNull(), keyID: ulid("key_id"), + enrichment: json("enrichment").$type<{ + plan: "sub" + }>(), }, (table) => [...workspaceIndexes(table), index("usage_time_created").on(table.workspaceID, table.timeCreated)], ) diff --git a/packages/console/core/src/schema/user.sql.ts b/packages/console/core/src/schema/user.sql.ts index 7fd7f5e1ed0b..46d02c4a857d 100644 --- a/packages/console/core/src/schema/user.sql.ts +++ b/packages/console/core/src/schema/user.sql.ts @@ -18,6 +18,12 @@ export const UserTable = mysqlTable( monthlyLimit: int("monthly_limit"), monthlyUsage: bigint("monthly_usage", { mode: "number" }), timeMonthlyUsageUpdated: utc("time_monthly_usage_updated"), + // subscription + timeSubscribed: utc("time_subscribed"), + subIntervalUsage: bigint("sub_interval_usage", { mode: "number" }), + subMonthlyUsage: bigint("sub_monthly_usage", { mode: "number" }), + timeSubIntervalUsageUpdated: utc("sub_time_interval_usage_updated"), + timeSubMonthlyUsageUpdated: utc("sub_time_monthly_usage_updated"), }, (table) => [ ...workspaceIndexes(table), diff --git a/packages/console/core/sst-env.d.ts b/packages/console/core/sst-env.d.ts index 27cc0914520f..4450c6cb6919 100644 --- a/packages/console/core/sst-env.d.ts +++ b/packages/console/core/sst-env.d.ts @@ -98,6 +98,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string diff --git a/packages/console/function/package.json b/packages/console/function/package.json index cc433d64785e..ab9239b7962b 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "1.1.4", + "version": "1.1.6", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/function/sst-env.d.ts b/packages/console/function/sst-env.d.ts index 27cc0914520f..4450c6cb6919 100644 --- a/packages/console/function/sst-env.d.ts +++ b/packages/console/function/sst-env.d.ts @@ -98,6 +98,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index a38da04aec7d..5b97f7b5a36d 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "1.1.4", + "version": "1.1.6", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", diff --git a/packages/console/resource/sst-env.d.ts b/packages/console/resource/sst-env.d.ts index 27cc0914520f..4450c6cb6919 100644 --- a/packages/console/resource/sst-env.d.ts +++ b/packages/console/resource/sst-env.d.ts @@ -98,6 +98,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string diff --git a/packages/desktop/package.json b/packages/desktop/package.json index c581bd9ecea1..c9b703bee22d 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@shuvcode/desktop", "private": true, - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "scripts": { @@ -14,6 +14,7 @@ }, "dependencies": { "@opencode-ai/app": "workspace:*", + "@opencode-ai/ui": "workspace:*", "@solid-primitives/storage": "catalog:", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", diff --git a/packages/desktop/src-tauri/Cargo.lock b/packages/desktop/src-tauri/Cargo.lock index a35db0b3af7e..c533bf9e95db 100644 --- a/packages/desktop/src-tauri/Cargo.lock +++ b/packages/desktop/src-tauri/Cargo.lock @@ -1177,6 +1177,21 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -1184,6 +1199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -1251,6 +1267,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -2775,6 +2792,7 @@ dependencies = [ name = "opencode-desktop" version = "0.0.0" dependencies = [ + "futures", "gtk", "listeners", "semver", diff --git a/packages/desktop/src-tauri/Cargo.toml b/packages/desktop/src-tauri/Cargo.toml index 00a759953711..3c898319a687 100644 --- a/packages/desktop/src-tauri/Cargo.toml +++ b/packages/desktop/src-tauri/Cargo.toml @@ -36,6 +36,7 @@ serde_json = "1" tokio = "1.48.0" listeners = "0.3" tauri-plugin-os = "2" +futures = "0.3.31" semver = "1.0.27" [target.'cfg(target_os = "linux")'.dependencies] diff --git a/packages/desktop/src-tauri/entitlements.plist b/packages/desktop/src-tauri/entitlements.plist index afa54db33b9f..61d6c38cef3d 100644 --- a/packages/desktop/src-tauri/entitlements.plist +++ b/packages/desktop/src-tauri/entitlements.plist @@ -12,5 +12,19 @@ com.apple.security.cs.disable-library-validation + com.apple.security.automation.apple-events + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.personal-information.addressbook + + com.apple.security.personal-information.calendars + + com.apple.security.personal-information.location + + com.apple.security.personal-information.photos-library + diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs index 4f1bacec1ea3..3b21099672a1 100644 --- a/packages/desktop/src-tauri/src/lib.rs +++ b/packages/desktop/src-tauri/src/lib.rs @@ -2,6 +2,7 @@ mod cli; mod window_customizer; use cli::{get_sidecar_path, install_cli, sync_cli}; +use futures::FutureExt; use std::{ collections::VecDeque, net::{SocketAddr, TcpListener}, @@ -9,10 +10,9 @@ use std::{ time::{Duration, Instant}, }; use tauri::{ - path::BaseDirectory, AppHandle, LogicalSize, Manager, RunEvent, WebviewUrl, WebviewWindow, + path::BaseDirectory, AppHandle, LogicalSize, Manager, RunEvent, State, WebviewUrl, + WebviewWindow, }; -use tauri_plugin_clipboard_manager::ClipboardExt; -use tauri_plugin_dialog::{DialogExt, MessageDialogButtons, MessageDialogResult}; use tauri_plugin_shell::process::{CommandChild, CommandEvent}; use tauri_plugin_shell::ShellExt; use tokio::net::TcpSocket; @@ -20,7 +20,26 @@ use tokio::net::TcpSocket; use crate::window_customizer::PinchZoomDisablePlugin; #[derive(Clone)] -struct ServerState(Arc>>); +struct ServerState { + child: Arc>>, + status: futures::future::Shared>>, +} + +impl ServerState { + pub fn new( + child: Option, + status: tokio::sync::oneshot::Receiver>, + ) -> Self { + Self { + child: Arc::new(Mutex::new(child)), + status: status.shared(), + } + } + + pub fn set_child(&self, child: Option) { + *self.child.lock().unwrap() = child; + } +} #[derive(Clone)] struct LogState(Arc>>); @@ -35,7 +54,7 @@ fn kill_sidecar(app: AppHandle) { }; let Some(server_state) = server_state - .0 + .child .lock() .expect("Failed to acquire mutex lock") .take() @@ -49,8 +68,7 @@ fn kill_sidecar(app: AppHandle) { println!("Killed server"); } -#[tauri::command] -async fn copy_logs_to_clipboard(app: AppHandle) -> Result<(), String> { +async fn get_logs(app: AppHandle) -> Result { let log_state = app.try_state::().ok_or("Log state not found")?; let logs = log_state @@ -58,25 +76,16 @@ async fn copy_logs_to_clipboard(app: AppHandle) -> Result<(), String> { .lock() .map_err(|_| "Failed to acquire log lock")?; - let log_text = logs.iter().cloned().collect::>().join(""); - - app.clipboard() - .write_text(log_text) - .map_err(|e| format!("Failed to copy to clipboard: {}", e))?; - - Ok(()) + Ok(logs.iter().cloned().collect::>().join("")) } #[tauri::command] -async fn get_logs(app: AppHandle) -> Result { - let log_state = app.try_state::().ok_or("Log state not found")?; - - let logs = log_state - .0 - .lock() - .map_err(|_| "Failed to acquire log lock")?; - - Ok(logs.iter().cloned().collect::>().join("")) +async fn ensure_server_started(state: State<'_, ServerState>) -> Result<(), String> { + state + .status + .clone() + .await + .map_err(|_| "Failed to get server status".to_string())? } fn get_sidecar_port() -> u32 { @@ -136,7 +145,7 @@ fn spawn_sidecar(app: &AppHandle, port: u32) -> CommandChild { .args([ "-il", "-c", - &format!("{} serve --port={}", sidecar.display(), port), + &format!("\"{}\" serve --port={}", sidecar.display(), port), ]) .spawn() .expect("Failed to spawn shuvcode") @@ -215,9 +224,8 @@ pub fn run() { .plugin(PinchZoomDisablePlugin) .invoke_handler(tauri::generate_handler![ kill_sidecar, - copy_logs_to_clipboard, - get_logs, - install_cli + install_cli, + ensure_server_started ]) .setup(move |app| { let app = app.handle().clone(); @@ -225,96 +233,94 @@ pub fn run() { // Initialize log state app.manage(LogState(Arc::new(Mutex::new(VecDeque::new())))); + // Get port and create window immediately for faster perceived startup + let port = get_sidecar_port(); + + let primary_monitor = app.primary_monitor().ok().flatten(); + let size = primary_monitor + .map(|m| m.size().to_logical(m.scale_factor())) + .unwrap_or(LogicalSize::new(1920, 1080)); + + // Create window immediately with serverReady = false + let mut window_builder = + WebviewWindow::builder(&app, "main", WebviewUrl::App("/".into())) + .title("Shuvcode") + .inner_size(size.width as f64, size.height as f64) + .decorations(true) + .zoom_hotkeys_enabled(true) + .disable_drag_drop_handler() + .initialization_script(format!( + r#" + window.__SHUVCODE__ ??= {{}}; + window.__SHUVCODE__.updaterEnabled = {updater_enabled}; + window.__SHUVCODE__.port = {port}; + window.__OPENCODE__ ??= window.__SHUVCODE__; + "# + )); + + #[cfg(target_os = "macos")] { - let app = app.clone(); - tauri::async_runtime::spawn(async move { - let port = get_sidecar_port(); - - let should_spawn_sidecar = !is_server_running(port).await; - - let child = if should_spawn_sidecar { - let child = spawn_sidecar(&app, port); - - let timestamp = Instant::now(); - loop { - if timestamp.elapsed() > Duration::from_secs(7) { - let res = app.dialog() - .message("Failed to spawn Shuvcode Server. Copy logs using the button below and send them to the team for assistance.") - .title("Startup Failed") - .buttons(MessageDialogButtons::OkCancelCustom("Copy Logs And Exit".to_string(), "Exit".to_string())) - .blocking_show_with_result(); - - - if matches!(&res, MessageDialogResult::Custom(name) if name == "Copy Logs And Exit") { - match copy_logs_to_clipboard(app.clone()).await { - Ok(()) => println!("Logs copied to clipboard successfully"), - Err(e) => println!("Failed to copy logs to clipboard: {}", e), - } - } - - app.exit(1); - - return; - } - - tokio::time::sleep(Duration::from_millis(10)).await; - - if is_server_running(port).await { - // give the server a little bit more time to warm up - tokio::time::sleep(Duration::from_millis(10)).await; - - break; - } - } - - println!("Server ready after {:?}", timestamp.elapsed()); - - Some(child) - } else { - None - }; - - let primary_monitor = app.primary_monitor().ok().flatten(); - let size = primary_monitor - .map(|m| m.size().to_logical(m.scale_factor())) - .unwrap_or(LogicalSize::new(1920, 1080)); - - let mut window_builder = - WebviewWindow::builder(&app, "main", WebviewUrl::App("/".into())) - .title("Shuvcode") - .inner_size(size.width as f64, size.height as f64) - .decorations(true) - .zoom_hotkeys_enabled(true) - .disable_drag_drop_handler() - .initialization_script(format!( - r#" - window.__SHUVCODE__ ??= {{}}; - window.__SHUVCODE__.updaterEnabled = {updater_enabled}; - window.__SHUVCODE__.port = {port}; - window.__OPENCODE__ ??= window.__SHUVCODE__; - "# - )); - - #[cfg(target_os = "macos")] - { - window_builder = window_builder - .title_bar_style(tauri::TitleBarStyle::Overlay) - .hidden_title(true); - } - - window_builder.build().expect("Failed to create window"); - - app.manage(ServerState(Arc::new(Mutex::new(child)))); - }); + window_builder = window_builder + .title_bar_style(tauri::TitleBarStyle::Overlay) + .hidden_title(true); } + let window = window_builder.build().expect("Failed to create window"); + + let (tx, rx) = tokio::sync::oneshot::channel(); + app.manage(ServerState::new(None, rx)); + { - let app = app.clone(); - tauri::async_runtime::spawn(async move { - if let Err(e) = sync_cli(app) { - eprintln!("Failed to sync CLI: {e}"); - } - }); + let app = app.clone(); + tauri::async_runtime::spawn(async move { + let should_spawn_sidecar = !is_server_running(port).await; + + let (child, res) = if should_spawn_sidecar { + let child = spawn_sidecar(&app, port); + + let timestamp = Instant::now(); + let res = loop { + if timestamp.elapsed() > Duration::from_secs(7) { + break Err(format!( + "Failed to spawn Shuvcode Server. Logs:\n{}", + get_logs(app.clone()).await.unwrap() + )); + } + + tokio::time::sleep(Duration::from_millis(10)).await; + + if is_server_running(port).await { + // give the server a little bit more time to warm up + tokio::time::sleep(Duration::from_millis(10)).await; + + break Ok(()); + } + }; + + println!("Server ready after {:?}", timestamp.elapsed()); + + (Some(child), res) + } else { + (None, Ok(())) + }; + + app.state::().set_child(child); + + if res.is_ok() { + let _ = window.eval("window.__SHUVCODE__.serverReady = true; window.__OPENCODE__.serverReady = true;"); + } + + let _ = tx.send(res); + }); + } + + { + let app = app.clone(); + tauri::async_runtime::spawn(async move { + if let Err(e) = sync_cli(app) { + eprintln!("Failed to sync CLI: {e}"); + } + }); } Ok(()) diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index 1b822e265223..941ea8df707d 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -1,21 +1,24 @@ // @refresh reload import { render } from "solid-js/web" -import { App, PlatformProvider, Platform } from "@opencode-ai/app" +import { AppBaseProviders, AppInterface, PlatformProvider, Platform } from "@opencode-ai/app" import { open, save } from "@tauri-apps/plugin-dialog" import { open as shellOpen } from "@tauri-apps/plugin-shell" import { type as ostype } from "@tauri-apps/plugin-os" +import { check, Update } from "@tauri-apps/plugin-updater" +import { invoke } from "@tauri-apps/api/core" +import { getCurrentWindow } from "@tauri-apps/api/window" +import { isPermissionGranted, requestPermission } from "@tauri-apps/plugin-notification" +import { relaunch } from "@tauri-apps/plugin-process" import { AsyncStorage } from "@solid-primitives/storage" import { fetch as tauriFetch } from "@tauri-apps/plugin-http" import { Store } from "@tauri-apps/plugin-store" +import { Logo } from "@opencode-ai/ui/logo" +import { Suspense, createResource, ParentProps } from "solid-js" import { UPDATER_ENABLED } from "./updater" import { createMenu } from "./menu" -import { check, Update } from "@tauri-apps/plugin-updater" -import { invoke } from "@tauri-apps/api/core" -import { getCurrentWindow } from "@tauri-apps/api/window" -import { isPermissionGranted, requestPermission } from "@tauri-apps/plugin-notification" -import { relaunch } from "@tauri-apps/plugin-process" import pkg from "../package.json" +import { Show } from "solid-js" const root = document.getElementById("root") if (import.meta.env.DEV && !(root instanceof HTMLElement)) { @@ -60,7 +63,7 @@ const platform: Platform = { void shellOpen(url).catch(() => undefined) }, - storage: (name = "default.dat") => { + storage: (() => { type StoreLike = { get(key: string): Promise set(key: string, value: string): Promise @@ -70,7 +73,13 @@ const platform: Platform = { length(): Promise } - const memory = () => { + const WRITE_DEBOUNCE_MS = 250 + + const storeCache = new Map>() + const apiCache = new Map Promise }>() + const memoryCache = new Map() + + const createMemoryStore = () => { const data = new Map() const store: StoreLike = { get: async (key) => data.get(key), @@ -89,45 +98,108 @@ const platform: Platform = { return store } - const api: AsyncStorage & { _store: Promise | null; _getStore: () => Promise } = { - _store: null, - _getStore: async () => { - if (api._store) return api._store - api._store = Store.load(name).catch(() => memory()) - return api._store - }, - getItem: async (key: string) => { - const store = await api._getStore() - const value = await store.get(key).catch(() => null) - if (value === undefined) return null - return value - }, - setItem: async (key: string, value: string) => { - const store = await api._getStore() - await store.set(key, value).catch(() => undefined) - }, - removeItem: async (key: string) => { - const store = await api._getStore() - await store.delete(key).catch(() => undefined) - }, - clear: async () => { - const store = await api._getStore() - await store.clear().catch(() => undefined) - }, - key: async (index: number) => { - const store = await api._getStore() - return (await store.keys().catch(() => []))[index] - }, - getLength: async () => { - const store = await api._getStore() - return await store.length().catch(() => 0) - }, - get length() { - return api.getLength() - }, + const getStore = (name: string) => { + const cached = storeCache.get(name) + if (cached) return cached + + const store = Store.load(name).catch(() => { + const cached = memoryCache.get(name) + if (cached) return cached + + const memory = createMemoryStore() + memoryCache.set(name, memory) + return memory + }) + + storeCache.set(name, store) + return store } - return api - }, + + const createStorage = (name: string) => { + const pending = new Map() + let timer: ReturnType | undefined + let flushing: Promise | undefined + + const flush = async () => { + if (flushing) return flushing + + flushing = (async () => { + const store = await getStore(name) + while (pending.size > 0) { + const batch = Array.from(pending.entries()) + pending.clear() + for (const [key, value] of batch) { + if (value === null) { + await store.delete(key).catch(() => undefined) + } else { + await store.set(key, value).catch(() => undefined) + } + } + } + })().finally(() => { + flushing = undefined + }) + + return flushing + } + + const schedule = () => { + if (timer) return + timer = setTimeout(() => { + timer = undefined + void flush() + }, WRITE_DEBOUNCE_MS) + } + + const api: AsyncStorage & { flush: () => Promise } = { + flush, + getItem: async (key: string) => { + const next = pending.get(key) + if (next !== undefined) return next + + const store = await getStore(name) + const value = await store.get(key).catch(() => null) + if (value === undefined) return null + return value + }, + setItem: async (key: string, value: string) => { + pending.set(key, value) + schedule() + }, + removeItem: async (key: string) => { + pending.set(key, null) + schedule() + }, + clear: async () => { + pending.clear() + const store = await getStore(name) + await store.clear().catch(() => undefined) + }, + key: async (index: number) => { + const store = await getStore(name) + return (await store.keys().catch(() => []))[index] + }, + getLength: async () => { + const store = await getStore(name) + return await store.length().catch(() => 0) + }, + get length() { + return api.getLength() + }, + } + + return api + } + + return (name = "default.dat") => { + const cached = apiCache.get(name) + if (cached) return cached + + const api = createStorage(name) + apiCache.set(name, api) + return api + } + })(), checkUpdate: async () => { if (!UPDATER_ENABLED) return { updateAvailable: false } @@ -200,7 +272,36 @@ render(() => { {ostype() === "macos" && (
)} - + + + + + ) }, root!) + +// Gate component that waits for the server to be ready +function ServerGate(props: ParentProps) { + const [status] = createResource(async () => { + if (window.__OPENCODE__?.serverReady) return + return await invoke("ensure_server_started") + }) + + return ( + // Not using suspense as not all components are compatible with it (undefined refs) + + +
Starting server...
+
+ } + > + {/* Trigger error boundary without rendering the returned value */} + {(status(), null)} + {props.children} + + ) +} diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 811e85717875..9e1f88ce2ac1 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "1.1.4", + "version": "1.1.6", "private": true, "type": "module", "license": "MIT", diff --git a/packages/enterprise/sst-env.d.ts b/packages/enterprise/sst-env.d.ts index 27cc0914520f..4450c6cb6919 100644 --- a/packages/enterprise/sst-env.d.ts +++ b/packages/enterprise/sst-env.d.ts @@ -98,6 +98,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 79c8e2ab51ac..1f27f8905001 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "opencode" name = "OpenCode" description = "The open source coding agent." -version = "1.1.4" +version = "1.1.6" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/anomalyco/opencode" @@ -11,26 +11,26 @@ name = "OpenCode" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.4/opencode-darwin-arm64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.6/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.4/opencode-darwin-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.6/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.4/opencode-linux-arm64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.6/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.4/opencode-linux-x64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.6/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.4/opencode-windows-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.6/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index 4db6d75b8be7..0ab07e019078 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "1.1.4", + "version": "1.1.6", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/function/sst-env.d.ts b/packages/function/sst-env.d.ts index 27cc0914520f..4450c6cb6919 100644 --- a/packages/function/sst-env.d.ts +++ b/packages/function/sst-env.d.ts @@ -98,6 +98,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 0b79d2842651..1f232155323b 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.1.4", + "version": "1.1.6", "name": "opencode", "type": "module", "license": "MIT", diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index de494ed1edbf..2111fe7b12ee 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -139,7 +139,7 @@ for (const item of targets) { autoloadPackageJson: true, target: bunTarget as any, outfile: `dist/${name}/bin/shuvcode`, - execArgv: [`--user-agent=shuvcode/${Script.version}`, "--"], + execArgv: [`--user-agent=shuvcode/${Script.version}`, "--use-system-ca", "--"], windows: {}, }, entrypoints: ["./src/index.ts", parserWorker, workerPath], diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index b157a4239300..ab3aef0fe5e2 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -96,7 +96,6 @@ export namespace Agent { options: {}, mode: "subagent", native: true, - hidden: true, }, explore: { name: "explore", @@ -189,6 +188,7 @@ export namespace Agent { item.topP = value.top_p ?? item.topP item.mode = value.mode ?? item.mode item.color = value.color ?? item.color + item.hidden = value.hidden ?? item.hidden item.name = value.name ?? item.name item.steps = value.steps ?? item.steps item.options = mergeDeep(item.options, value.options ?? {}) diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index 1cfd71cd9e8e..912e52a7440e 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -76,9 +76,10 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ }) }, color(name: string) { - const agent = agents().find((x) => x.name === name) + const all = sync.data.agent + const agent = all.find((x) => x.name === name) if (agent?.color) return RGBA.fromHex(agent.color) - const index = agents().findIndex((x) => x.name === name) + const index = all.findIndex((x) => x.name === name) if (index === -1) return colors()[0] return colors()[index % colors().length] }, diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx index cadfacb1d69d..6d5bb91ab050 100644 --- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx @@ -1,5 +1,5 @@ import { RGBA } from "@opentui/core" -import { createEffect, createMemo } from "solid-js" +import { createEffect, createMemo, onMount } from "solid-js" import { useSync } from "@tui/context/sync" import { createSimpleContext } from "./helper" import { useKV } from "./kv" @@ -37,11 +37,11 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ createEffect(() => { const theme = sync.data.config.theme - console.log("theme", theme) if (theme) setStore("active", theme) }) - createEffect(() => { + function init() { + resolveSystemTheme() getCustomThemes() .then((custom) => { setStore( @@ -58,15 +58,18 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ setStore("ready", true) } }) - }) + } + + onMount(init) function resolveSystemTheme() { - console.log("resolved system theme") + console.log("resolveSystemTheme") renderer .getPalette({ size: 16, }) .then((colors) => { + console.log(colors.palette) if (!colors.palette[0]) { if (store.active === "system") { setStore( @@ -90,11 +93,9 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ } const renderer = useRenderer() - resolveSystemTheme() - - const sdk = useSDK() - sdk.event.on("server.instance.disposed", () => { - resolveSystemTheme() + process.on("SIGUSR2", async () => { + renderer.clearPaletteCache() + init() }) const values = createMemo(() => { diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 6bf39ea34fd9..fcc36df61053 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -2147,12 +2147,33 @@ function GenericTool(props: ToolProps) { ) } -function InlineTool(props: { icon: string; complete: any; pending: string; children: JSX.Element; part: ToolPart }) { +function ToolTitle(props: { fallback: string; when: any; icon: string; children: JSX.Element }) { + const { theme } = useTheme() + return ( + + ~ {props.fallback}} when={props.when}> + {props.icon} {props.children} + + + ) +} + +function InlineTool(props: { + icon: string + iconColor?: RGBA + complete: any + pending: string + children: JSX.Element + part: ToolPart +}) { const [margin, setMargin] = createSignal(0) const { theme } = useTheme() const ctx = use() const sync = useSync() + // Show spinner when tool is actively running + const isRunning = createMemo(() => props.part.state.status === "running") + const permission = createMemo(() => { const callID = sync.data.permission[ctx.sessionID]?.at(0)?.tool?.callID if (!callID) return false @@ -2198,7 +2219,11 @@ function InlineTool(props: { icon: string; complete: any; pending: string; child > ~ {props.pending}} when={props.complete}> - {props.icon} {props.children} + {props.icon} {props.children} + + + {" "} + {getSpinnerFrame()} @@ -2213,6 +2238,7 @@ function BlockTool(props: { title: string; children: JSX.Element; onClick?: () = const renderer = useRenderer() const [hover, setHover] = createSignal(false) const error = createMemo(() => (props.part?.state.status === "error" ? props.part.state.error : undefined)) + const isRunning = createMemo(() => props.part?.state.status === "running") return ( {props.title} + + {" "} + {getSpinnerFrame()} + {props.children} @@ -2449,8 +2479,10 @@ function Task(props: ToolProps) { const { navigate } = useRoute() const dialog = useDialog() const renderer = useRenderer() + const local = useLocal() const current = createMemo(() => props.metadata.summary?.findLast((x) => x.state.status !== "pending")) + const color = createMemo(() => local.agent.color(props.input.subagent_type ?? "unknown")) return ( @@ -2488,11 +2520,13 @@ function Task(props: ToolProps) { - {Locale.titlecase(props.input.subagent_type ?? "unknown")} Task "{props.input.description}" + {Locale.titlecase(props.input.subagent_type ?? "unknown")} Task " + {props.input.description}" diff --git a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts index 398aff5af272..9c91cf3055a3 100644 --- a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts +++ b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts @@ -32,7 +32,7 @@ export namespace Clipboard { if (os === "win32" || release().includes("WSL")) { const script = "Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img) { $ms = New-Object System.IO.MemoryStream; $img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png); [System.Convert]::ToBase64String($ms.ToArray()) }" - const base64 = await $`powershell.exe -command "${script}"`.nothrow().text() + const base64 = await $`powershell.exe -NonInteractive -NoProfile -command "${script}"`.nothrow().text() if (base64) { const imageBuffer = Buffer.from(base64.trim(), "base64") if (imageBuffer.length > 0) { @@ -110,8 +110,9 @@ export namespace Clipboard { if (os === "win32") { console.log("clipboard: using powershell") return async (text: string) => { - const escaped = text.replace(/"/g, '""') - await $`powershell -command "Set-Clipboard -Value \"${escaped}\""`.nothrow().quiet() + // need to escape backticks because powershell uses them as escape code + const escaped = text.replace(/"/g, '""').replace(/`/g, "``") + await $`powershell -NonInteractive -NoProfile -Command "Set-Clipboard -Value \"${escaped}\""`.nothrow().quiet() } } diff --git a/packages/opencode/src/cli/error.ts b/packages/opencode/src/cli/error.ts index 54ced0d7a765..569b186d55ca 100644 --- a/packages/opencode/src/cli/error.ts +++ b/packages/opencode/src/cli/error.ts @@ -47,9 +47,10 @@ export function FormatUnknownError(input: unknown): string { if (typeof input === "object" && input !== null) { try { - const json = JSON.stringify(input, null, 2) - if (json && json !== "{}") return json - } catch {} + return JSON.stringify(input, null, 2) + } catch { + return "Unexpected error (unserializable)" + } } return String(input) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index c95d6b3a6aa6..0b437a201a4b 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -465,6 +465,10 @@ export namespace Config { disable: z.boolean().optional(), description: z.string().optional().describe("Description of when to use the agent"), mode: z.enum(["subagent", "primary", "all"]).optional(), + hidden: z + .boolean() + .optional() + .describe("Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)"), options: z.record(z.string(), z.any()).optional(), color: z .string() @@ -490,6 +494,7 @@ export namespace Config { "temperature", "top_p", "mode", + "hidden", "color", "steps", "maxSteps", diff --git a/packages/opencode/src/permission/next.ts b/packages/opencode/src/permission/next.ts index 9a0395fa1ec8..f95aaf345254 100644 --- a/packages/opencode/src/permission/next.ts +++ b/packages/opencode/src/permission/next.ts @@ -232,6 +232,7 @@ export namespace PermissionNext { const result = new Set() for (const tool of tools) { const permission = EDIT_TOOLS.includes(tool) ? "edit" : tool + const rule = ruleset.findLast((r) => Wildcard.match(permission, r.permission)) if (!rule) continue if (rule.pattern === "*" && rule.action === "deny") result.add(tool) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 2acb7d8abeca..7d8d417ae827 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -197,14 +197,35 @@ export namespace Provider { if (!profile && !awsAccessKeyId && !awsBearerToken) return { autoload: false } - const { fromNodeProviderChain } = await import(await BunProc.install("@aws-sdk/credential-providers")) + const awsSdkPath = await BunProc.install("@aws-sdk/credential-providers") + + // Helper to load credential provider with bundled/unbundled export handling + // When shuvcode bundles via Bun.build(), the export structure changes: + // - Unbundled (upstream): module.fromNodeProviderChain (direct named export) + // - Bundled (shuvcode): module.default.fromNodeProviderChain or module.default.default.fromNodeProviderChain + const loadCredentialProvider = async (options: { profile?: string }) => { + const awsSdkModule = await import(awsSdkPath) + // Handle both named exports and multiple default wrappers produced by Bun + const fromNodeProviderChain = + awsSdkModule.fromNodeProviderChain ?? + awsSdkModule.default?.fromNodeProviderChain ?? + awsSdkModule.default?.default?.fromNodeProviderChain + + if (!fromNodeProviderChain) { + throw new Error( + "AWS SDK credentials provider is missing fromNodeProviderChain export. " + + "Inspect ~/.cache/opencode/bundled for the actual module shape and adjust this helper if Bun changes its wrapper.", + ) + } + return fromNodeProviderChain(options) + } // Build credential provider options (only pass profile if specified) const credentialProviderOptions = profile ? { profile } : {} const providerOptions: AmazonBedrockProviderSettings = { region: defaultRegion, - credentialProvider: fromNodeProviderChain(credentialProviderOptions), + credentialProvider: await loadCredentialProvider(credentialProviderOptions), } // Add custom endpoint if specified (endpoint takes precedence over baseURL) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 4d3ef83e3e3f..e78dcc4f99a6 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -239,7 +239,12 @@ export namespace Server { }, ) .use(async (c, next) => { - const directory = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd() + let directory = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd() + try { + directory = decodeURIComponent(directory) + } catch { + // fallback to original value + } return Instance.provide({ directory, init: InstanceBootstrap, diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index ebc5c74b4949..344097fe8b7a 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -37,7 +37,7 @@ import { SessionSummary } from "./summary" import { NamedError } from "@opencode-ai/util/error" import { fn } from "@/util/fn" import { SessionProcessor } from "./processor" -import { TaskTool } from "@/tool/task" +import { TaskTool, filterSubagents, TASK_DESCRIPTION } from "@/tool/task" import { Tool } from "@/tool/tool" import { PermissionNext } from "@/permission/next" import { SessionStatus } from "./status" @@ -310,155 +310,147 @@ export namespace SessionPrompt { }) const model = await Provider.getModel(lastUser.model.providerID, lastUser.model.modelID) + const task = tasks.pop() - const subtasks = tasks.filter((t): t is Extract => t.type === "subtask") - const otherTasks = tasks.filter((t) => t.type !== "subtask") - tasks.length = 0 - tasks.push(...otherTasks) - - // pending subtasks + // pending subtask // TODO: centralize "invoke tool" logic - if (subtasks.length > 0) { + if (task?.type === "subtask") { const taskTool = await TaskTool.init() - - const executeSubtask = async (task: (typeof subtasks)[0]) => { - const assistantMessage = (await Session.updateMessage({ - id: Identifier.ascending("message"), - role: "assistant", - parentID: lastUser.id, - sessionID, - mode: task.agent, - agent: task.agent, - path: { - cwd: Instance.directory, - root: Instance.worktree, - }, - cost: 0, - tokens: { - input: 0, - output: 0, - reasoning: 0, - cache: { read: 0, write: 0 }, + const assistantMessage = (await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "assistant", + parentID: lastUser.id, + sessionID, + mode: task.agent, + agent: task.agent, + path: { + cwd: Instance.directory, + root: Instance.worktree, + }, + cost: 0, + tokens: { + input: 0, + output: 0, + reasoning: 0, + cache: { read: 0, write: 0 }, + }, + modelID: model.id, + providerID: model.providerID, + time: { + created: Date.now(), + }, + })) as MessageV2.Assistant + let part = (await Session.updatePart({ + id: Identifier.ascending("part"), + messageID: assistantMessage.id, + sessionID: assistantMessage.sessionID, + type: "tool", + callID: ulid(), + tool: TaskTool.id, + state: { + status: "running", + input: { + prompt: task.prompt, + description: task.description, + subagent_type: task.agent, + command: task.command, }, - modelID: model.id, - providerID: model.providerID, time: { - created: Date.now(), - }, - })) as MessageV2.Assistant - let part = (await Session.updatePart({ - id: Identifier.ascending("part"), - messageID: assistantMessage.id, - sessionID: assistantMessage.sessionID, - type: "tool", - callID: ulid(), - tool: TaskTool.id, - state: { - status: "running", - input: { - prompt: task.prompt, - description: task.description, - subagent_type: task.agent, - command: task.command, - }, - time: { - start: Date.now(), - }, - }, - })) as MessageV2.ToolPart - const taskArgs = { - prompt: task.prompt, - description: task.description, - subagent_type: task.agent, - command: task.command, - } - await Plugin.trigger( - "tool.execute.before", - { - tool: "task", - sessionID, - callID: part.id, + start: Date.now(), }, - { args: taskArgs }, - ) - let executionError: Error | undefined - const taskAgent = await Agent.get(task.agent) - const taskCtx: Tool.Context = { - agent: task.agent, - messageID: assistantMessage.id, - sessionID: sessionID, - abort, - extra: { model: task.model }, - async metadata(input) { - await Session.updatePart({ - ...part, - type: "tool", - state: { - ...part.state, - ...input, - }, - } satisfies MessageV2.ToolPart) - }, - async ask(req) { - await PermissionNext.ask({ - ...req, - sessionID: sessionID, - ruleset: PermissionNext.merge(taskAgent.permission, session.permission ?? []), - }) - }, - } - const result = await taskTool.execute(taskArgs, taskCtx).catch((error) => { - executionError = error - log.error("subtask execution failed", { error, agent: task.agent, description: task.description }) - return undefined - }) - await Plugin.trigger( - "tool.execute.after", - { - tool: "task", - sessionID, - callID: part.id, - }, - result, - ) - assistantMessage.finish = "tool-calls" - assistantMessage.time.completed = Date.now() - await Session.updateMessage(assistantMessage) - if (result && part.state.status === "running") { + }, + })) as MessageV2.ToolPart + const taskArgs = { + prompt: task.prompt, + description: task.description, + subagent_type: task.agent, + command: task.command, + } + await Plugin.trigger( + "tool.execute.before", + { + tool: "task", + sessionID, + callID: part.id, + }, + { args: taskArgs }, + ) + let executionError: Error | undefined + const taskAgent = await Agent.get(task.agent) + const taskCtx: Tool.Context = { + agent: task.agent, + messageID: assistantMessage.id, + sessionID: sessionID, + abort, + callID: part.callID, + extra: { userInvokedAgents: [task.agent] }, + async metadata(input) { await Session.updatePart({ ...part, + type: "tool", state: { - status: "completed", - input: part.state.input, - title: result.title, - metadata: result.metadata, - output: result.output, - attachments: result.attachments, - time: { - ...part.state.time, - end: Date.now(), - }, + ...part.state, + ...input, }, } satisfies MessageV2.ToolPart) - } - if (!result) { - await Session.updatePart({ - ...part, - state: { - status: "error", - error: executionError ? `Tool execution failed: ${executionError.message}` : "Tool execution failed", - time: { - start: part.state.status === "running" ? part.state.time.start : Date.now(), - end: Date.now(), - }, - metadata: part.metadata, - input: part.state.input, + }, + async ask(req) { + await PermissionNext.ask({ + ...req, + sessionID: sessionID, + ruleset: PermissionNext.merge(taskAgent.permission, session.permission ?? []), + }) + }, + } + const result = await taskTool.execute(taskArgs, taskCtx).catch((error) => { + executionError = error + log.error("subtask execution failed", { error, agent: task.agent, description: task.description }) + return undefined + }) + await Plugin.trigger( + "tool.execute.after", + { + tool: "task", + sessionID, + callID: part.id, + }, + result, + ) + assistantMessage.finish = "tool-calls" + assistantMessage.time.completed = Date.now() + await Session.updateMessage(assistantMessage) + if (result && part.state.status === "running") { + await Session.updatePart({ + ...part, + state: { + status: "completed", + input: part.state.input, + title: result.title, + metadata: result.metadata, + output: result.output, + attachments: result.attachments, + time: { + ...part.state.time, + end: Date.now(), }, - } satisfies MessageV2.ToolPart) - } + }, + } satisfies MessageV2.ToolPart) + } + if (!result) { + await Session.updatePart({ + ...part, + state: { + status: "error", + error: executionError ? `Tool execution failed: ${executionError.message}` : "Tool execution failed", + time: { + start: part.state.status === "running" ? part.state.time.start : Date.now(), + end: Date.now(), + }, + metadata: part.metadata, + input: part.state.input, + }, + } satisfies MessageV2.ToolPart) } - - await Promise.all(subtasks.map(executeSubtask)) // Add synthetic user message to prevent certain reasoning models from erroring // If we create assistant messages w/ out user ones following mid loop thinking signatures @@ -470,8 +462,8 @@ export namespace SessionPrompt { time: { created: Date.now(), }, - agent: subtasks[0]?.parentAgent ?? lastUser.agent, - model: subtasks[0]?.parentModel ?? lastUser.model, + agent: lastUser.agent, + model: lastUser.model, } await Session.updateMessage(summaryUserMsg) await Session.updatePart({ @@ -486,8 +478,6 @@ export namespace SessionPrompt { continue } - const task = otherTasks.pop() - // pending compaction if (task?.type === "compaction") { const result = await SessionCompaction.process({ @@ -554,12 +544,20 @@ export namespace SessionPrompt { model, abort, }) + + // Track agents explicitly invoked by user via @ autocomplete + const userInvokedAgents = msgs + .filter((m) => m.info.role === "user") + .flatMap((m) => m.parts.filter((p) => p.type === "agent") as MessageV2.AgentPart[]) + .map((p) => p.name) + const tools = await resolveTools({ agent, session, model, tools: lastUser.tools, processor, + userInvokedAgents, }) if (step === 1) { @@ -637,8 +635,9 @@ export namespace SessionPrompt { async function lastModel(sessionID: string) { for await (const item of MessageV2.stream(sessionID)) { - if (item.info.role === "user" && item.info.model?.modelID) return item.info.model + if (item.info.role === "user" && item.info.model) return item.info.model } + return Provider.defaultModel() } async function resolveTools(input: { @@ -647,6 +646,7 @@ export namespace SessionPrompt { session: Session.Info tools?: Record processor: SessionProcessor.Info + userInvokedAgents: string[] }) { using _ = log.time("resolveTools") const tools: Record = {} @@ -656,57 +656,23 @@ export namespace SessionPrompt { abort: options.abortSignal!, messageID: input.processor.message.id, callID: options.toolCallId, - extra: { model: input.model }, + extra: { model: input.model, userInvokedAgents: input.userInvokedAgents }, agent: input.agent.name, metadata: async (val: { title?: string; metadata?: any }) => { const match = input.processor.partFromToolCall(options.toolCallId) - if (!match) return - - // Only allow updates for pending or running status - // Block updates after tool has completed or errored - if (match.state.status === "completed" || match.state.status === "error") { - log.warn("ctx.metadata write attempt after completion", { - status: match.state.status, - tool: match.tool, - callID: options.toolCallId, - }) - return - } - - // Handle pending status: tool execute() can be called before tool-call event - // transitions the part to running. In this case, we transition it ourselves. - if (match.state.status === "pending") { - const updatedPart: MessageV2.ToolPart = { - ...match, - state: { - title: val.title, - metadata: val.metadata, - status: "running", - input: args, - time: { start: Date.now() }, - }, - } - await Session.updatePart(updatedPart) - // Update local toolcalls map so subsequent events see the new state - input.processor.updateToolCall(options.toolCallId, updatedPart) - return - } - - // Normal running status update - if (match.state.status === "running") { - const updatedPart: MessageV2.ToolPart = { + if (match && match.state.status === "running") { + await Session.updatePart({ ...match, state: { title: val.title, metadata: val.metadata, status: "running", input: args, - time: match.state.time, + time: { + start: Date.now(), + }, }, - } - await Session.updatePart(updatedPart) - // Update local toolcalls map so subsequent events see the new state - input.processor.updateToolCall(options.toolCallId, updatedPart) + }) } }, async ask(req) { @@ -833,6 +799,29 @@ export namespace SessionPrompt { } tools[key] = item } + + // Regenerate task tool description with filtered subagents + if (tools.task) { + const all = await Agent.list().then((x) => x.filter((a) => a.mode !== "primary")) + const filtered = filterSubagents(all, input.agent.permission) + + // If no subagents are permitted, remove the task tool entirely + if (filtered.length === 0) { + delete tools.task + } else { + const description = TASK_DESCRIPTION.replace( + "{agents}", + filtered + .map((a) => `- ${a.name}: ${a.description ?? "This subagent should only be called manually by the user."}`) + .join("\n"), + ) + tools.task = { + ...tools.task, + description, + } + } + } + return tools } @@ -847,7 +836,7 @@ export namespace SessionPrompt { }, tools: input.tools, agent: agent.name, - model: input.model ?? agent.model ?? (await lastModel(input.sessionID)) ?? (await Provider.defaultModel()), + model: input.model ?? agent.model ?? (await lastModel(input.sessionID)), system: input.system, variant: input.variant, } @@ -1142,6 +1131,9 @@ export namespace SessionPrompt { } if (part.type === "agent") { + // Check if this agent would be denied by task permission + const perm = PermissionNext.evaluate("task", part.name, agent.permission) + const hint = perm.action === "deny" ? " . Invoked by user; guaranteed to exist." : "" return [ { id: Identifier.ascending("part"), @@ -1155,9 +1147,12 @@ export namespace SessionPrompt { sessionID: input.sessionID, type: "text", synthetic: true, + // An extra space is added here. Otherwise the 'Use' gets appended + // to user's last word; making a combined word text: - "Use the above message and context to generate a prompt and call the task tool with subagent: " + - part.name, + " Use the above message and context to generate a prompt and call the task tool with subagent: " + + part.name + + hint, }, ] } @@ -1251,7 +1246,7 @@ export namespace SessionPrompt { SessionRevert.cleanup(session) } const agent = await Agent.get(input.agent) - const model = input.model ?? agent.model ?? (await lastModel(input.sessionID)) ?? (await Provider.defaultModel()) + const model = input.model ?? agent.model ?? (await lastModel(input.sessionID)) const userMsg: MessageV2.User = { id: Identifier.ascending("message"), sessionID: input.sessionID, @@ -1276,10 +1271,6 @@ export namespace SessionPrompt { } await Session.updatePart(userPart) - // Use session.directory as the authoritative source for cwd - // This ensures shell commands work correctly even if Instance.directory - // hasn't been properly initialized yet (e.g., first message in a new project) - const cwd = session.directory const msg: MessageV2.Assistant = { id: Identifier.ascending("message"), sessionID: input.sessionID, @@ -1288,7 +1279,7 @@ export namespace SessionPrompt { agent: input.agent, cost: 0, path: { - cwd, + cwd: Instance.directory, root: Instance.worktree, }, time: { @@ -1379,7 +1370,7 @@ export namespace SessionPrompt { const args = matchingInvocation?.args const proc = spawn(shell, args, { - cwd, + cwd: Instance.directory, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"], env: { @@ -1499,76 +1490,13 @@ export namespace SessionPrompt { log.info("command", input) const command = await Command.get(input.command) if (!command) { - log.warn("command not found", { command: input.command }) - return - } - - if (command.sessionOnly) { - try { - await Session.get(input.sessionID) - } catch (error) { - const message = `/${command.name} requires an existing session` - log.warn("session-only command blocked", { - command: command.name, - sessionID: input.sessionID, - error, - }) - Bus.publish(Session.Event.Error, { - sessionID: input.sessionID, - error: new NamedError.Unknown({ - message, - }).toObject(), - }) - throw new Error(message) - } - } - - // Plugin commands execute directly via hook - if (command.type === "plugin") { - const plugins = await Plugin.list() - for (const plugin of plugins) { - const pluginCommands = plugin["plugin.command"] - const pluginCommand = pluginCommands?.[command.name] - if (!pluginCommand) continue - - const messagesBefore = await Session.messages({ sessionID: input.sessionID, limit: 1 }) - const lastMessageIDBefore = messagesBefore[0]?.info.id - - try { - const client = await Plugin.client() - await pluginCommand.execute({ - sessionID: input.sessionID, - arguments: input.arguments, - client, - }) - } catch (error) { - const message = error instanceof Error ? error.message : String(error) - log.error("plugin command failed", { command: command.name, error: message }) - Bus.publish(Session.Event.Error, { - sessionID: input.sessionID, - error: new NamedError.Unknown({ - message: `/${command.name} failed: ${message}`, - }).toObject(), - }) - throw error - } - - // Emit event if plugin created a new message - const messagesAfter = await Session.messages({ sessionID: input.sessionID, limit: 1 }) - if (messagesAfter.length > 0 && messagesAfter[0].info.id !== lastMessageIDBefore) { - Bus.publish(Command.Event.Executed, { - name: command.name, - sessionID: input.sessionID, - arguments: input.arguments, - messageID: messagesAfter[0].info.id, - }) - return messagesAfter[0] - } - return - } - return + const error = new NamedError.Unknown({ message: `Command not found: "${input.command}"` }) + Bus.publish(Session.Event.Error, { + sessionID: input.sessionID, + error: error.toObject(), + }) + throw error } - const agentName = command.agent ?? input.agent ?? (await Agent.defaultAgent()) const raw = input.arguments.match(argsRegex) ?? [] @@ -1609,7 +1537,6 @@ export namespace SessionPrompt { } template = template.trim() - const sessionModel = await lastModel(input.sessionID) const model = await (async () => { if (command.model) { return Provider.parseModel(command.model) @@ -1621,7 +1548,7 @@ export namespace SessionPrompt { } } if (input.model) return Provider.parseModel(input.model) - return sessionModel ?? (await Provider.defaultModel()) + return await lastModel(input.sessionID) })() try { @@ -1648,8 +1575,6 @@ export namespace SessionPrompt { }) throw error } - const parentAgent = input.agent ?? "build" - const parentModel = input.model ? Provider.parseModel(input.model) : sessionModel const templateParts = await resolvePromptParts(template) const parts = @@ -1660,25 +1585,12 @@ export namespace SessionPrompt { agent: agent.name, description: command.description ?? "", command: input.command, - model: { providerID: model.providerID, modelID: model.modelID }, - parentAgent, - parentModel, // TODO: how can we make task tool accept a more complex input? prompt: templateParts.find((y) => y.type === "text")?.text ?? "", }, ] : [...templateParts, ...(input.parts ?? [])] - await Plugin.trigger( - "command.execute.before", - { - command: input.command, - sessionID: input.sessionID, - arguments: input.arguments, - }, - { parts }, - ) - const result = (await prompt({ sessionID: input.sessionID, messageID: input.messageID, diff --git a/packages/opencode/src/session/truncation.ts b/packages/opencode/src/session/truncation.ts new file mode 100644 index 000000000000..15177a55a654 --- /dev/null +++ b/packages/opencode/src/session/truncation.ts @@ -0,0 +1,60 @@ +export namespace Truncate { + export const MAX_LINES = 2000 + export const MAX_BYTES = 50 * 1024 + + export interface Result { + content: string + truncated: boolean + } + + export interface Options { + maxLines?: number + maxBytes?: number + direction?: "head" | "tail" + } + + export function output(text: string, options: Options = {}): Result { + const maxLines = options.maxLines ?? MAX_LINES + const maxBytes = options.maxBytes ?? MAX_BYTES + const direction = options.direction ?? "head" + const lines = text.split("\n") + const totalBytes = Buffer.byteLength(text, "utf-8") + + if (lines.length <= maxLines && totalBytes <= maxBytes) { + return { content: text, truncated: false } + } + + const out: string[] = [] + var i = 0 + var bytes = 0 + var hitBytes = false + + if (direction === "head") { + for (i = 0; i < lines.length && i < maxLines; i++) { + const size = Buffer.byteLength(lines[i], "utf-8") + (i > 0 ? 1 : 0) + if (bytes + size > maxBytes) { + hitBytes = true + break + } + out.push(lines[i]) + bytes += size + } + const removed = hitBytes ? totalBytes - bytes : lines.length - out.length + const unit = hitBytes ? "chars" : "lines" + return { content: `${out.join("\n")}\n\n...${removed} ${unit} truncated...`, truncated: true } + } + + for (i = lines.length - 1; i >= 0 && out.length < maxLines; i--) { + const size = Buffer.byteLength(lines[i], "utf-8") + (out.length > 0 ? 1 : 0) + if (bytes + size > maxBytes) { + hitBytes = true + break + } + out.unshift(lines[i]) + bytes += size + } + const removed = hitBytes ? totalBytes - bytes : lines.length - out.length + const unit = hitBytes ? "chars" : "lines" + return { content: `...${removed} ${unit} truncated...\n\n${out.join("\n")}`, truncated: true } + } +} diff --git a/packages/opencode/src/tool/grep.ts b/packages/opencode/src/tool/grep.ts index 4cbc5347f57d..464c6286f66c 100644 --- a/packages/opencode/src/tool/grep.ts +++ b/packages/opencode/src/tool/grep.ts @@ -6,6 +6,7 @@ import DESCRIPTION from "./grep.txt" import { Instance } from "../project/instance" const MAX_LINE_LENGTH = 2000 +const MATCH_LIMIT = 100 export const GrepTool = Tool.define("grep", { description: DESCRIPTION, @@ -44,11 +45,69 @@ export const GrepTool = Tool.define("grep", { stderr: "pipe", }) - const output = await new Response(proc.stdout).text() + // Stream ripgrep output to prevent memory exhaustion on large result sets + const reader = proc.stdout.getReader() + const decoder = new TextDecoder() + let buffer = "" + const matches: Array<{ + path: string + lineNum: number + lineText: string + }> = [] + let truncated = false + + try { + while (true) { + const { done, value } = await reader.read() + if (done) break + + buffer += decoder.decode(value, { stream: true }) + // Handle both Unix (\n) and Windows (\r\n) line endings + const lines = buffer.split(/\r?\n/) + buffer = lines.pop() || "" + + for (const line of lines) { + if (!line) continue + if (matches.length >= MATCH_LIMIT) { + truncated = true + break + } + + const [filePath, lineNumStr, ...lineTextParts] = line.split("|") + if (!filePath || !lineNumStr || lineTextParts.length === 0) continue + + matches.push({ + path: filePath, + lineNum: parseInt(lineNumStr, 10), + lineText: lineTextParts.join("|"), + }) + } + + if (truncated) break + } + + // Process any remaining buffer content + if (!truncated && buffer) { + const [filePath, lineNumStr, ...lineTextParts] = buffer.split("|") + if (filePath && lineNumStr && lineTextParts.length > 0 && matches.length < MATCH_LIMIT) { + matches.push({ + path: filePath, + lineNum: parseInt(lineNumStr, 10), + lineText: lineTextParts.join("|"), + }) + } + } + } finally { + // Kill ripgrep early if we've hit the limit to save resources + if (truncated) proc.kill() + reader.releaseLock() + } + const errorOutput = await new Response(proc.stderr).text() const exitCode = await proc.exited - if (exitCode === 1) { + // Exit code 1 means no matches found + if (exitCode === 1 && matches.length === 0) { return { title: params.pattern, metadata: { matches: 0, truncated: false }, @@ -56,42 +115,12 @@ export const GrepTool = Tool.define("grep", { } } - if (exitCode !== 0) { + // Only throw on non-zero exit if we didn't truncate (kill) the process + if (exitCode !== 0 && exitCode !== 1 && !truncated) { throw new Error(`ripgrep failed: ${errorOutput}`) } - // Handle both Unix (\n) and Windows (\r\n) line endings - const lines = output.trim().split(/\r?\n/) - const matches = [] - - for (const line of lines) { - if (!line) continue - - const [filePath, lineNumStr, ...lineTextParts] = line.split("|") - if (!filePath || !lineNumStr || lineTextParts.length === 0) continue - - const lineNum = parseInt(lineNumStr, 10) - const lineText = lineTextParts.join("|") - - const file = Bun.file(filePath) - const stats = await file.stat().catch(() => null) - if (!stats) continue - - matches.push({ - path: filePath, - modTime: stats.mtime.getTime(), - lineNum, - lineText, - }) - } - - matches.sort((a, b) => b.modTime - a.modTime) - - const limit = 100 - const truncated = matches.length > limit - const finalMatches = truncated ? matches.slice(0, limit) : matches - - if (finalMatches.length === 0) { + if (matches.length === 0) { return { title: params.pattern, metadata: { matches: 0, truncated: false }, @@ -99,10 +128,10 @@ export const GrepTool = Tool.define("grep", { } } - const outputLines = [`Found ${finalMatches.length} matches`] + const outputLines = [`Found ${matches.length} matches`] let currentFile = "" - for (const match of finalMatches) { + for (const match of matches) { if (currentFile !== match.path) { if (currentFile !== "") { outputLines.push("") @@ -123,7 +152,7 @@ export const GrepTool = Tool.define("grep", { return { title: params.pattern, metadata: { - matches: finalMatches.length, + matches: matches.length, truncated, }, output: outputLines.join("\n"), diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 63077cdf7540..386c4da24bdc 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -24,6 +24,7 @@ import { CodeSearchTool } from "./codesearch" import { Flag } from "@/flag/flag" import { Log } from "@/util/log" import { LspTool } from "./lsp" +import { Truncate } from "../session/truncation" export namespace ToolRegistry { const log = Log.create({ service: "tool.registry" }) @@ -65,10 +66,11 @@ export namespace ToolRegistry { description: def.description, execute: async (args, ctx) => { const result = await def.execute(args as any, ctx) + const out = Truncate.output(result) return { title: "", - output: result, - metadata: {}, + output: out.truncated ? out.content : result, + metadata: { truncated: out.truncated }, } }, }), diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 3e20491f4202..4c3a30467fe0 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -11,9 +11,14 @@ import { iife } from "@/util/iife" import { defer } from "@/util/defer" import { Config } from "../config/config" import { Provider } from "../provider/provider" +import { PermissionNext } from "@/permission/next" export { DESCRIPTION as TASK_DESCRIPTION } +export function filterSubagents(agents: Agent.Info[], ruleset: PermissionNext.Ruleset) { + return agents.filter((a) => PermissionNext.evaluate("task", a.name, ruleset).action !== "deny") +} + export const TaskTool = Tool.define("task", async () => { const agents = await Agent.list().then((x) => x.filter((a) => a.mode !== "primary")) const description = DESCRIPTION.replace( @@ -33,15 +38,20 @@ export const TaskTool = Tool.define("task", async () => { }), async execute(params, ctx) { const config = await Config.get() - await ctx.ask({ - permission: "task", - patterns: [params.subagent_type], - always: ["*"], - metadata: { - description: params.description, - subagent_type: params.subagent_type, - }, - }) + + const userInvokedAgents = (ctx.extra?.userInvokedAgents ?? []) as string[] + // Skip permission check when invoked from a command subtask (user already approved by invoking the command) + if (!ctx.extra?.bypassAgentCheck && !userInvokedAgents.includes(params.subagent_type)) { + await ctx.ask({ + permission: "task", + patterns: [params.subagent_type], + always: ["*"], + metadata: { + description: params.description, + subagent_type: params.subagent_type, + }, + }) + } const agent = await Agent.get(params.subagent_type) if (!agent) throw new Error(`Unknown agent type: ${params.subagent_type} is not a valid agent type`) diff --git a/packages/opencode/src/tool/tool.ts b/packages/opencode/src/tool/tool.ts index 145b007682b5..7e97b4ff09ef 100644 --- a/packages/opencode/src/tool/tool.ts +++ b/packages/opencode/src/tool/tool.ts @@ -2,6 +2,7 @@ import z from "zod" import type { MessageV2 } from "../session/message-v2" import type { Agent } from "../agent/agent" import type { PermissionNext } from "../permission/next" +import { Truncate } from "../session/truncation" export namespace Tool { interface Metadata { @@ -53,7 +54,7 @@ export namespace Tool { init: async (ctx) => { const toolInfo = init instanceof Function ? await init(ctx) : init const execute = toolInfo.execute - toolInfo.execute = (args, ctx) => { + toolInfo.execute = async (args, ctx) => { try { toolInfo.parameters.parse(args) } catch (error) { @@ -65,7 +66,16 @@ export namespace Tool { { cause: error }, ) } - return execute(args, ctx) + const result = await execute(args, ctx) + const truncated = Truncate.output(result.output) + return { + ...result, + output: truncated.content, + metadata: { + ...result.metadata, + truncated: truncated.truncated, + }, + } } return toolInfo }, diff --git a/packages/opencode/test/agent/agent.test.ts b/packages/opencode/test/agent/agent.test.ts index dd74869a1cfd..259dae8fbcc8 100644 --- a/packages/opencode/test/agent/agent.test.ts +++ b/packages/opencode/test/agent/agent.test.ts @@ -84,7 +84,7 @@ test("general agent denies todo tools", async () => { const general = await Agent.get("general") expect(general).toBeDefined() expect(general?.mode).toBe("subagent") - expect(general?.hidden).toBe(true) + expect(general?.hidden).toBeUndefined() expect(evalPerm(general, "todoread")).toBe("deny") expect(evalPerm(general, "todowrite")).toBe("deny") }, diff --git a/packages/opencode/test/permission-task.test.ts b/packages/opencode/test/permission-task.test.ts new file mode 100644 index 000000000000..21a039d12a6b --- /dev/null +++ b/packages/opencode/test/permission-task.test.ts @@ -0,0 +1,459 @@ +import { describe, test, expect } from "bun:test" +import type { Agent } from "../src/agent/agent" +import { filterSubagents } from "../src/tool/task" +import { PermissionNext } from "../src/permission/next" +import { Config } from "../src/config/config" +import { Instance } from "../src/project/instance" +import { tmpdir } from "./fixture/fixture" + +describe("filterSubagents - permission.task filtering", () => { + const createRuleset = (rules: Record): PermissionNext.Ruleset => + Object.entries(rules).map(([pattern, action]) => ({ + permission: "task", + pattern, + action, + })) + + const mockAgents = [ + { name: "general", mode: "subagent", permission: [], options: {} }, + { name: "code-reviewer", mode: "subagent", permission: [], options: {} }, + { name: "orchestrator-fast", mode: "subagent", permission: [], options: {} }, + { name: "orchestrator-slow", mode: "subagent", permission: [], options: {} }, + ] as Agent.Info[] + + test("returns all agents when permissions config is empty", () => { + const result = filterSubagents(mockAgents, []) + expect(result).toHaveLength(4) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("excludes agents with explicit deny", () => { + const ruleset = createRuleset({ "code-reviewer": "deny" }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["general", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("includes agents with explicit allow", () => { + const ruleset = createRuleset({ + "code-reviewer": "allow", + general: "deny", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["code-reviewer", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("includes agents with ask permission (user approval is runtime behavior)", () => { + const ruleset = createRuleset({ + "code-reviewer": "ask", + general: "deny", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["code-reviewer", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("includes agents with undefined permission (default allow)", () => { + const ruleset = createRuleset({ + general: "deny", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["code-reviewer", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("supports wildcard patterns with deny", () => { + const ruleset = createRuleset({ "orchestrator-*": "deny" }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(2) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer"]) + }) + + test("supports wildcard patterns with allow", () => { + const ruleset = createRuleset({ + "*": "allow", + "orchestrator-fast": "deny", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator-slow"]) + }) + + test("supports wildcard patterns with ask", () => { + const ruleset = createRuleset({ + "orchestrator-*": "ask", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(4) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator-fast", "orchestrator-slow"]) + }) + + test("longer pattern takes precedence over shorter pattern", () => { + const ruleset = createRuleset({ + "orchestrator-*": "deny", + "orchestrator-fast": "allow", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator-fast"]) + }) + + test("edge case: all agents denied", () => { + const ruleset = createRuleset({ "*": "deny" }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(0) + expect(result).toEqual([]) + }) + + test("edge case: mixed patterns with multiple wildcards", () => { + const ruleset = createRuleset({ + "*": "ask", + "orchestrator-*": "deny", + "orchestrator-fast": "allow", + }) + const result = filterSubagents(mockAgents, ruleset) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator-fast"]) + }) + + test("hidden: true does not affect filtering (hidden only affects autocomplete)", () => { + const agents = [ + { name: "general", mode: "subagent", hidden: true, permission: [], options: {} }, + { name: "code-reviewer", mode: "subagent", hidden: false, permission: [], options: {} }, + { name: "orchestrator", mode: "subagent", permission: [], options: {} }, + ] as Agent.Info[] + + const result = filterSubagents(agents, []) + expect(result).toHaveLength(3) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer", "orchestrator"]) + }) + + test("hidden: true agents can be filtered by permission.task deny", () => { + const agents = [ + { name: "general", mode: "subagent", hidden: true, permission: [], options: {} }, + { name: "orchestrator-coder", mode: "subagent", hidden: true, permission: [], options: {} }, + ] as Agent.Info[] + + const ruleset = createRuleset({ general: "deny" }) + const result = filterSubagents(agents, ruleset) + expect(result).toHaveLength(1) + expect(result.map((a) => a.name)).toEqual(["orchestrator-coder"]) + }) +}) + +describe("PermissionNext.evaluate for permission.task", () => { + const createRuleset = (rules: Record): PermissionNext.Ruleset => + Object.entries(rules).map(([pattern, action]) => ({ + permission: "task", + pattern, + action, + })) + + test("returns ask when no match (default)", () => { + expect(PermissionNext.evaluate("task", "code-reviewer", []).action).toBe("ask") + }) + + test("returns deny for explicit deny", () => { + const ruleset = createRuleset({ "code-reviewer": "deny" }) + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("deny") + }) + + test("returns allow for explicit allow", () => { + const ruleset = createRuleset({ "code-reviewer": "allow" }) + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("allow") + }) + + test("returns ask for explicit ask", () => { + const ruleset = createRuleset({ "code-reviewer": "ask" }) + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("ask") + }) + + test("matches wildcard patterns with deny", () => { + const ruleset = createRuleset({ "orchestrator-*": "deny" }) + expect(PermissionNext.evaluate("task", "orchestrator-fast", ruleset).action).toBe("deny") + expect(PermissionNext.evaluate("task", "orchestrator-slow", ruleset).action).toBe("deny") + expect(PermissionNext.evaluate("task", "general", ruleset).action).toBe("ask") + }) + + test("matches wildcard patterns with allow", () => { + const ruleset = createRuleset({ "orchestrator-*": "allow" }) + expect(PermissionNext.evaluate("task", "orchestrator-fast", ruleset).action).toBe("allow") + expect(PermissionNext.evaluate("task", "orchestrator-slow", ruleset).action).toBe("allow") + }) + + test("matches wildcard patterns with ask", () => { + const ruleset = createRuleset({ "orchestrator-*": "ask" }) + expect(PermissionNext.evaluate("task", "orchestrator-fast", ruleset).action).toBe("ask") + const globalRuleset = createRuleset({ "*": "ask" }) + expect(PermissionNext.evaluate("task", "code-reviewer", globalRuleset).action).toBe("ask") + }) + + test("later rules take precedence (last match wins)", () => { + const ruleset = createRuleset({ + "orchestrator-*": "deny", + "orchestrator-fast": "allow", + }) + expect(PermissionNext.evaluate("task", "orchestrator-fast", ruleset).action).toBe("allow") + expect(PermissionNext.evaluate("task", "orchestrator-slow", ruleset).action).toBe("deny") + }) + + test("matches global wildcard", () => { + expect(PermissionNext.evaluate("task", "any-agent", createRuleset({ "*": "allow" })).action).toBe("allow") + expect(PermissionNext.evaluate("task", "any-agent", createRuleset({ "*": "deny" })).action).toBe("deny") + expect(PermissionNext.evaluate("task", "any-agent", createRuleset({ "*": "ask" })).action).toBe("ask") + }) +}) + +describe("PermissionNext.disabled for task tool", () => { + // Note: The `disabled` function checks if a TOOL should be completely removed from the tool list. + // It only disables a tool when there's a rule with `pattern: "*"` and `action: "deny"`. + // It does NOT evaluate complex subagent patterns - those are handled at runtime by `evaluate`. + const createRuleset = (rules: Record): PermissionNext.Ruleset => + Object.entries(rules).map(([pattern, action]) => ({ + permission: "task", + pattern, + action, + })) + + test("task tool is disabled when global deny pattern exists (even with specific allows)", () => { + // When "*": "deny" exists, the task tool is disabled because the disabled() function + // only checks for wildcard deny patterns - it doesn't consider that specific subagents might be allowed + const ruleset = createRuleset({ + "orchestrator-*": "allow", + "*": "deny", + }) + const disabled = PermissionNext.disabled(["task", "bash", "read"], ruleset) + // The task tool IS disabled because there's a pattern: "*" with action: "deny" + expect(disabled.has("task")).toBe(true) + }) + + test("task tool is disabled when global deny pattern exists (even with ask overrides)", () => { + const ruleset = createRuleset({ + "orchestrator-*": "ask", + "*": "deny", + }) + const disabled = PermissionNext.disabled(["task"], ruleset) + // The task tool IS disabled because there's a pattern: "*" with action: "deny" + expect(disabled.has("task")).toBe(true) + }) + + test("task tool is disabled when global deny pattern exists", () => { + const ruleset = createRuleset({ "*": "deny" }) + const disabled = PermissionNext.disabled(["task"], ruleset) + expect(disabled.has("task")).toBe(true) + }) + + test("task tool is NOT disabled when only specific patterns are denied (no wildcard)", () => { + // The disabled() function only disables tools when pattern: "*" && action: "deny" + // Specific subagent denies don't disable the task tool - those are handled at runtime + const ruleset = createRuleset({ + "orchestrator-*": "deny", + general: "deny", + }) + const disabled = PermissionNext.disabled(["task"], ruleset) + // The task tool is NOT disabled because no rule has pattern: "*" with action: "deny" + expect(disabled.has("task")).toBe(false) + }) + + test("task tool is enabled when no task rules exist (default ask)", () => { + const disabled = PermissionNext.disabled(["task"], []) + expect(disabled.has("task")).toBe(false) + }) + + test("task tool is NOT disabled when last wildcard pattern is allow", () => { + // Last matching rule wins - if wildcard allow comes after wildcard deny, tool is enabled + const ruleset = createRuleset({ + "*": "deny", + "orchestrator-coder": "allow", + }) + const disabled = PermissionNext.disabled(["task"], ruleset) + // The disabled() function uses findLast and checks if the last matching rule + // has pattern: "*" and action: "deny". In this case, the last rule matching + // "task" permission has pattern "orchestrator-coder", not "*", so not disabled + expect(disabled.has("task")).toBe(false) + }) +}) + +// Integration tests that load permissions from real config files +describe("permission.task with real config files", () => { + const mockAgents = [ + { name: "general", mode: "subagent", permission: [], options: {} }, + { name: "code-reviewer", mode: "subagent", permission: [], options: {} }, + { name: "orchestrator-fast", mode: "subagent", permission: [], options: {} }, + ] as Agent.Info[] + + test("loads task permissions from opencode.json config", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + task: { + "*": "allow", + "code-reviewer": "deny", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + const result = filterSubagents(mockAgents, ruleset) + expect(result.map((a) => a.name)).toEqual(["general", "orchestrator-fast"]) + }, + }) + }) + + test("loads task permissions with wildcard patterns from config", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + task: { + "*": "ask", + "orchestrator-*": "deny", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + const result = filterSubagents(mockAgents, ruleset) + expect(result.map((a) => a.name)).toEqual(["general", "code-reviewer"]) + }, + }) + }) + + test("evaluate respects task permission from config", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + task: { + general: "allow", + "code-reviewer": "deny", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + expect(PermissionNext.evaluate("task", "general", ruleset).action).toBe("allow") + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("deny") + // Unspecified agents default to "ask" + expect(PermissionNext.evaluate("task", "unknown-agent", ruleset).action).toBe("ask") + }, + }) + }) + + test("mixed permission config with task and other tools", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + bash: "allow", + edit: "ask", + task: { + "*": "deny", + general: "allow", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + + // Verify task permissions + expect(PermissionNext.evaluate("task", "general", ruleset).action).toBe("allow") + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("deny") + + // Verify other tool permissions + expect(PermissionNext.evaluate("bash", "*", ruleset).action).toBe("allow") + expect(PermissionNext.evaluate("edit", "*", ruleset).action).toBe("ask") + + // Verify disabled tools + const disabled = PermissionNext.disabled(["bash", "edit", "task"], ruleset) + expect(disabled.has("bash")).toBe(false) + expect(disabled.has("edit")).toBe(false) + // task is NOT disabled because disabled() uses findLast, and the last rule + // matching "task" permission is {pattern: "general", action: "allow"}, not pattern: "*" + expect(disabled.has("task")).toBe(false) + }, + }) + }) + + test("task tool disabled when global deny comes last in config", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + task: { + general: "allow", + "code-reviewer": "allow", + "*": "deny", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + + // Last matching rule wins - "*" deny is last, so all agents are denied + expect(PermissionNext.evaluate("task", "general", ruleset).action).toBe("deny") + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("deny") + expect(PermissionNext.evaluate("task", "unknown", ruleset).action).toBe("deny") + + // Since "*": "deny" is the last rule, disabled() finds it with findLast + // and sees pattern: "*" with action: "deny", so task is disabled + const disabled = PermissionNext.disabled(["task"], ruleset) + expect(disabled.has("task")).toBe(true) + }, + }) + }) + + test("task tool NOT disabled when specific allow comes last in config", async () => { + await using tmp = await tmpdir({ + git: true, + config: { + permission: { + task: { + "*": "deny", + general: "allow", + }, + }, + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const config = await Config.get() + const ruleset = PermissionNext.fromConfig(config.permission ?? {}) + + // Evaluate uses findLast - "general" allow comes after "*" deny + expect(PermissionNext.evaluate("task", "general", ruleset).action).toBe("allow") + // Other agents still denied by the earlier "*" deny + expect(PermissionNext.evaluate("task", "code-reviewer", ruleset).action).toBe("deny") + + // disabled() uses findLast and checks if the last rule has pattern: "*" with action: "deny" + // In this case, the last rule is {pattern: "general", action: "allow"}, not pattern: "*" + // So the task tool is NOT disabled (even though most subagents are denied) + const disabled = PermissionNext.disabled(["task"], ruleset) + expect(disabled.has("task")).toBe(false) + }, + }) + }) +}) diff --git a/packages/opencode/test/provider/amazon-bedrock.test.ts b/packages/opencode/test/provider/amazon-bedrock.test.ts index d10e851391e3..64b70efe9033 100644 --- a/packages/opencode/test/provider/amazon-bedrock.test.ts +++ b/packages/opencode/test/provider/amazon-bedrock.test.ts @@ -203,3 +203,59 @@ test("Bedrock: includes custom endpoint in options when specified", async () => }, }) }) + +// === Bundled Export Shape Tests === +// These tests verify that the loadCredentialProvider helper correctly handles +// various export shapes produced by Bun's bundler + +test("Bedrock: handles bundled module with default.fromNodeProviderChain export", async () => { + // This simulates how Bun wraps CJS modules in ESM default export + const mockFn = () => async () => ({ + accessKeyId: "mock-key", + secretAccessKey: "mock-secret", + }) + + // Test that the coalescing logic correctly extracts the function + const mockModule: Record = { default: { fromNodeProviderChain: mockFn() } } + const fromNodeProviderChain = + mockModule.fromNodeProviderChain ?? + (mockModule.default as Record)?.fromNodeProviderChain ?? + ((mockModule.default as Record)?.default as Record)?.fromNodeProviderChain + + expect(fromNodeProviderChain).toBeDefined() + expect(typeof fromNodeProviderChain).toBe("function") +}) + +test("Bedrock: handles bundled module with default.default.fromNodeProviderChain export", async () => { + // This simulates double-wrapping that can occur with nested re-exports + const mockFn = () => async () => ({ + accessKeyId: "mock-key", + secretAccessKey: "mock-secret", + }) + + const mockModule: Record = { default: { default: { fromNodeProviderChain: mockFn() } } } + const fromNodeProviderChain = + mockModule.fromNodeProviderChain ?? + (mockModule.default as Record)?.fromNodeProviderChain ?? + ((mockModule.default as Record)?.default as Record)?.fromNodeProviderChain + + expect(fromNodeProviderChain).toBeDefined() + expect(typeof fromNodeProviderChain).toBe("function") +}) + +test("Bedrock: handles direct named export (unbundled)", async () => { + // This is the standard export shape from npm without bundling + const mockFn = () => async () => ({ + accessKeyId: "mock-key", + secretAccessKey: "mock-secret", + }) + + const mockModule: Record = { fromNodeProviderChain: mockFn() } + const fromNodeProviderChain = + mockModule.fromNodeProviderChain ?? + (mockModule.default as Record)?.fromNodeProviderChain ?? + ((mockModule.default as Record)?.default as Record)?.fromNodeProviderChain + + expect(fromNodeProviderChain).toBeDefined() + expect(typeof fromNodeProviderChain).toBe("function") +}) diff --git a/packages/opencode/test/session/fixtures/models-api.json b/packages/opencode/test/session/fixtures/models-api.json new file mode 100644 index 000000000000..7f55e04a5682 --- /dev/null +++ b/packages/opencode/test/session/fixtures/models-api.json @@ -0,0 +1,33453 @@ +{ + "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-k2-thinking-turbo": { + "id": "kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-0905-preview": { + "id": "kimi-k2-0905-preview", + "name": "Kimi K2 0905", + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-0711-preview": { + "id": "kimi-k2-0711-preview", + "name": "Kimi K2 0711", + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 131072, "output": 16384 } + }, + "kimi-k2-turbo-preview": { + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo", + "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, + "cost": { "input": 2.4, "output": 10, "cache_read": 0.6 }, + "limit": { "context": 262144, "output": 262144 } + } + } + }, + "lucidquery": { + "id": "lucidquery", + "env": ["LUCIDQUERY_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://lucidquery.com/api/v1", + "name": "LucidQuery AI", + "doc": "https://lucidquery.com/api/docs", + "models": { + "lucidquery-nexus-coder": { + "id": "lucidquery-nexus-coder", + "name": "LucidQuery Nexus Coder", + "family": "lucidquery-nexus-coder", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 5 }, + "limit": { "context": 250000, "output": 60000 } + }, + "lucidnova-rf1-100b": { + "id": "lucidnova-rf1-100b", + "name": "LucidNova RF1 100B", + "family": "nova", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 5 }, + "limit": { "context": 120000, "output": 8000 } + } + } + }, + "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-thinking-turbo": { + "id": "kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-turbo-preview": { + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo", + "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, + "cost": { "input": 2.4, "output": 10, "cache_read": 0.6 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-0711-preview": { + "id": "kimi-k2-0711-preview", + "name": "Kimi K2 0711", + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 131072, "output": 16384 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-0905-preview": { + "id": "kimi-k2-0905-preview", + "name": "Kimi K2 0905", + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + } + } + }, + "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-4.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.5-flash": { + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "family": "glm-4.5-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5": { + "id": "glm-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5-air": { + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5v": { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 64000, "output": 16384 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + } + } + }, + "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": { + "kimi-k2-thinking:cloud": { + "id": "kimi-k2-thinking:cloud", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "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": 256000, "output": 8192 } + }, + "qwen3-vl-235b-cloud": { + "id": "qwen3-vl-235b-cloud", + "name": "Qwen3-VL 235B Instruct", + "family": "qwen3-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-22", + "last_updated": "2025-09-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 200000, "output": 8192 } + }, + "qwen3-coder:480b-cloud": { + "id": "qwen3-coder:480b-cloud", + "name": "Qwen3 Coder 480B", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 200000, "output": 8192 } + }, + "gpt-oss:120b-cloud": { + "id": "gpt-oss:120b-cloud", + "name": "GPT-OSS 120B", + "family": "gpt-oss:120b", + "attachment": false, + "reasoning": true, + "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": 200000, "output": 8192 } + }, + "deepseek-v3.1:671b-cloud": { + "id": "deepseek-v3.1:671b-cloud", + "name": "DeepSeek-V3.1 671B", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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": 160000, "output": 8192 } + }, + "glm-4.6:cloud": { + "id": "glm-4.6:cloud", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "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": 200000, "output": 8192 } + }, + "cogito-2.1:671b-cloud": { + "id": "cogito-2.1:671b-cloud", + "name": "Cogito 2.1 671B", + "family": "cogito-2.1:671b-cloud", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 160000, "output": 8192 } + }, + "gpt-oss:20b-cloud": { + "id": "gpt-oss:20b-cloud", + "name": "GPT-OSS 20B", + "family": "gpt-oss:20b", + "attachment": false, + "reasoning": true, + "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": 200000, "output": 8192 } + }, + "qwen3-vl-235b-instruct-cloud": { + "id": "qwen3-vl-235b-instruct-cloud", + "name": "Qwen3-VL 235B Instruct", + "family": "qwen3-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-22", + "last_updated": "2025-09-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 200000, "output": 8192 } + }, + "kimi-k2:1t-cloud": { + "id": "kimi-k2:1t-cloud", + "name": "Kimi K2", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 256000, "output": 8192 } + }, + "minimax-m2:cloud": { + "id": "minimax-m2:cloud", + "name": "MiniMax M2", + "family": "minimax", + "attachment": false, + "reasoning": false, + "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": 200000, "output": 8192 } + }, + "gemini-3-pro-preview:latest": { + "id": "gemini-3-pro-preview:latest", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 1000000, "output": 64000 } + } + } + }, + "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-flash": { + "id": "mimo-v2-flash", + "name": "MiMo-V2-Flash", + "family": "mimo-v2-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-12-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.21 }, + "limit": { "context": 256000, "output": 32000 } + } + } + }, + "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-livetranslate-flash-realtime": { + "id": "qwen3-livetranslate-flash-realtime", + "name": "Qwen3-LiveTranslate Flash Realtime", + "family": "qwen3", + "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, + "cost": { "input": 10, "output": 10, "input_audio": 10, "output_audio": 38 }, + "limit": { "context": 53248, "output": 4096 } + }, + "qwen3-asr-flash": { + "id": "qwen3-asr-flash", + "name": "Qwen3-ASR Flash", + "family": "qwen3", + "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, + "cost": { "input": 0.035, "output": 0.035 }, + "limit": { "context": 53248, "output": 4096 } + }, + "qwen-omni-turbo": { + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "family": "qwen-omni", + "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, + "cost": { "input": 0.07, "output": 0.27, "input_audio": 4.44, "output_audio": 8.89 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-vl-max": { + "id": "qwen-vl-max", + "name": "Qwen-VL Max", + "family": "qwen-vl", + "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, + "cost": { "input": 0.8, "output": 3.2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-next-80b-a3b-instruct": { + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen-turbo": { + "id": "qwen-turbo", + "name": "Qwen Turbo", + "family": "qwen-turbo", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.2, "reasoning": 0.5 }, + "limit": { "context": 1000000, "output": 16384 } + }, + "qwen3-vl-235b-a22b": { + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3-VL 235B-A22B", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.7, "output": 2.8, "reasoning": 8.4 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen3-coder-flash": { + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "qwen3-vl-30b-a3b": { + "id": "qwen3-vl-30b-a3b", + "name": "Qwen3-VL 30B-A3B", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.8, "reasoning": 2.4 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen3-14b": { + "id": "qwen3-14b", + "name": "Qwen3 14B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 1.4, "reasoning": 4.2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qvq-max": { + "id": "qvq-max", + "name": "QVQ Max", + "family": "qvq-max", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.2, "output": 4.8 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen-plus-character-ja": { + "id": "qwen-plus-character-ja", + "name": "Qwen Plus Character (Japanese)", + "family": "qwen-plus", + "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, + "cost": { "input": 0.5, "output": 1.4 }, + "limit": { "context": 8192, "output": 512 } + }, + "qwen2-5-14b-instruct": { + "id": "qwen2-5-14b-instruct", + "name": "Qwen2.5 14B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.35, "output": 1.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwq-plus": { + "id": "qwq-plus", + "name": "QwQ Plus", + "family": "qwq", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.8, "output": 2.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-coder-30b-a3b-instruct": { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.45, "output": 2.25 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen-vl-ocr": { + "id": "qwen-vl-ocr", + "name": "Qwen-VL OCR", + "family": "qwen-vl", + "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, + "cost": { "input": 0.72, "output": 0.72 }, + "limit": { "context": 34096, "output": 4096 } + }, + "qwen2-5-72b-instruct": { + "id": "qwen2-5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 1.4, "output": 5.6 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-omni-flash": { + "id": "qwen3-omni-flash", + "name": "Qwen3-Omni Flash", + "family": "qwen3-omni", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.43, "output": 1.66, "input_audio": 3.81, "output_audio": 15.11 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen-flash": { + "id": "qwen-flash", + "name": "Qwen Flash", + "family": "qwen-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen3-8b": { + "id": "qwen3-8b", + "name": "Qwen3 8B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.18, "output": 0.7, "reasoning": 2.1 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-omni-flash-realtime": { + "id": "qwen3-omni-flash-realtime", + "name": "Qwen3-Omni Flash Realtime", + "family": "qwen3-omni", + "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, + "cost": { "input": 0.52, "output": 1.99, "input_audio": 4.57, "output_audio": 18.13 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen2-5-vl-72b-instruct": { + "id": "qwen2-5-vl-72b-instruct", + "name": "Qwen2.5-VL 72B Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 2.8, "output": 8.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-vl-plus": { + "id": "qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.6, "reasoning": 4.8 }, + "limit": { "context": 262144, "output": 32768 } + }, + "qwen-plus": { + "id": "qwen-plus", + "name": "Qwen Plus", + "family": "qwen-plus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.4, "output": 1.2, "reasoning": 4 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen2-5-32b-instruct": { + "id": "qwen2-5-32b-instruct", + "name": "Qwen2.5 32B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.7, "output": 2.8 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-omni-7b": { + "id": "qwen2-5-omni-7b", + "name": "Qwen2.5-Omni 7B", + "family": "qwen2.5-omni", + "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, + "cost": { "input": 0.1, "output": 0.4, "input_audio": 6.76 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-max": { + "id": "qwen-max", + "name": "Qwen Max", + "family": "qwen-max", + "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, + "cost": { "input": 1.6, "output": 6.4 }, + "limit": { "context": 32768, "output": 8192 } + }, + "qwen2-5-7b-instruct": { + "id": "qwen2-5-7b-instruct", + "name": "Qwen2.5 7B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.175, "output": 0.7 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-vl-7b-instruct": { + "id": "qwen2-5-vl-7b-instruct", + "name": "Qwen2.5-VL 7B Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 0.35, "output": 1.05 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-235b-a22b": { + "id": "qwen3-235b-a22b", + "name": "Qwen3 235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.8, "reasoning": 8.4 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen-omni-turbo-realtime": { + "id": "qwen-omni-turbo-realtime", + "name": "Qwen-Omni Turbo Realtime", + "family": "qwen-omni", + "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, + "cost": { "input": 0.27, "output": 1.07, "input_audio": 4.44, "output_audio": 8.89 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-mt-turbo": { + "id": "qwen-mt-turbo", + "name": "Qwen-MT Turbo", + "family": "qwen-mt", + "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, + "cost": { "input": 0.16, "output": 0.49 }, + "limit": { "context": 16384, "output": 8192 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 1.5, "output": 7.5 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen-mt-plus": { + "id": "qwen-mt-plus", + "name": "Qwen-MT Plus", + "family": "qwen-mt", + "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, + "cost": { "input": 2.46, "output": 7.37 }, + "limit": { "context": 16384, "output": 8192 } + }, + "qwen3-max": { + "id": "qwen3-max", + "name": "Qwen3 Max", + "family": "qwen3", + "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, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen3-coder-plus": { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "family": "qwen3-coder", + "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, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "qwen3-next-80b-a3b-thinking": { + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 6 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.8, "reasoning": 8.4 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen-vl-plus": { + "id": "qwen-vl-plus", + "name": "Qwen-VL Plus", + "family": "qwen-vl", + "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, + "cost": { "input": 0.21, "output": 0.63 }, + "limit": { "context": 131072, "output": 8192 } + } + } + }, + "xai": { + "id": "xai", + "env": ["XAI_API_KEY"], + "npm": "@ai-sdk/xai", + "name": "xAI", + "doc": "https://docs.x.ai/docs/models", + "models": { + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "grok-3-fast": { + "id": "grok-3-fast", + "name": "Grok 3 Fast", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 1.25 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-4": { + "id": "grok-4", + "name": "Grok 4", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "reasoning": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 64000 } + }, + "grok-2-vision": { + "id": "grok-2-vision", + "name": "Grok 2 Vision", + "family": "grok-2", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 8192, "output": 4096 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "grok-2": { + "id": "grok-2", + "name": "Grok 2", + "family": "grok-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-3-mini-fast-latest": { + "id": "grok-3-mini-fast-latest", + "name": "Grok 3 Mini Fast Latest", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 4, "reasoning": 4, "cache_read": 0.15 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-2-vision-1212": { + "id": "grok-2-vision-1212", + "name": "Grok 2 Vision (1212)", + "family": "grok-2", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-12-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 8192, "output": 4096 } + }, + "grok-3": { + "id": "grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-4-fast": { + "id": "grok-4-fast", + "name": "Grok 4 Fast", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "grok-2-latest": { + "id": "grok-2-latest", + "name": "Grok 2 Latest", + "family": "grok-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-12-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-4-1-fast": { + "id": "grok-4-1-fast", + "name": "Grok 4.1 Fast", + "family": "grok", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "grok-2-1212": { + "id": "grok-2-1212", + "name": "Grok 2 (1212)", + "family": "grok-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-12-12", + "last_updated": "2024-12-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-3-fast-latest": { + "id": "grok-3-fast-latest", + "name": "Grok 3 Fast Latest", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 1.25 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-3-latest": { + "id": "grok-3-latest", + "name": "Grok 3 Latest", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-2-vision-latest": { + "id": "grok-2-vision-latest", + "name": "Grok 2 Vision Latest", + "family": "grok-2", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-12-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 8192, "output": 4096 } + }, + "grok-vision-beta": { + "id": "grok-vision-beta", + "name": "Grok Vision Beta", + "family": "grok-vision", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 15, "cache_read": 5 }, + "limit": { "context": 8192, "output": 4096 } + }, + "grok-3-mini": { + "id": "grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-beta": { + "id": "grok-beta", + "name": "Grok Beta", + "family": "grok-beta", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 5, "output": 15, "cache_read": 5 }, + "limit": { "context": 131072, "output": 4096 } + }, + "grok-3-mini-latest": { + "id": "grok-3-mini-latest", + "name": "Grok 3 Mini Latest", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "grok-4-1-fast-non-reasoning": { + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "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, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "grok-3-mini-fast": { + "id": "grok-3-mini-fast", + "name": "Grok 3 Mini Fast", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 4, "reasoning": 4, "cache_read": 0.15 }, + "limit": { "context": 131072, "output": 8192 } + } + } + }, + "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": { + "deepseek-r1-distill-qwen-32b": { + "id": "deepseek-r1-distill-qwen-32b", + "name": "DeepSeek R1 Distill Qwen 32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 121808, "output": 8192 } + }, + "qwen2.5-coder-32b-instruct": { + "id": "qwen2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-11-06", + "last_updated": "2024-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 12952, "output": 2048 } + }, + "kimi-k2-instruct": { + "id": "kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 58904, "output": 4096 } + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 121808, "output": 8192 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-06-23", + "last_updated": "2025-06-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 121808, "output": 8192 } + } + } + }, + "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": { + "moonshotai/kimi-k2-instruct-0905": { + "id": "moonshotai/kimi-k2-instruct-0905", + "name": "Kimi K2 0905", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-11", + "last_updated": "2025-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-instruct": { + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2025-01-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "nvidia/nvidia-nemotron-nano-9b-v2": { + "id": "nvidia/nvidia-nemotron-nano-9b-v2", + "name": "nvidia-nemotron-nano-9b-v2", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nvidia/cosmos-nemotron-34b": { + "id": "nvidia/cosmos-nemotron-34b", + "name": "Cosmos Nemotron 34B", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "nvidia/llama-embed-nemotron-8b": { + "id": "nvidia/llama-embed-nemotron-8b", + "name": "Llama Embed Nemotron 8B", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "knowledge": "2025-03", + "release_date": "2025-03-18", + "last_updated": "2025-03-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 2048 } + }, + "nvidia/nemotron-3-nano-30b-a3b": { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "nemotron-3-nano-30b-a3b", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-09", + "release_date": "2024-12", + "last_updated": "2024-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nvidia/parakeet-tdt-0.6b-v2": { + "id": "nvidia/parakeet-tdt-0.6b-v2", + "name": "Parakeet TDT 0.6B v2", + "family": "parakeet-tdt-0.6b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 4096 } + }, + "nvidia/nemoretriever-ocr-v1": { + "id": "nvidia/nemoretriever-ocr-v1", + "name": "NeMo Retriever OCR v1", + "family": "nemoretriever-ocr", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 4096 } + }, + "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", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-03-16", + "last_updated": "2025-03-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "nvidia/llama-3.1-nemotron-51b-instruct": { + "id": "nvidia/llama-3.1-nemotron-51b-instruct", + "name": "Llama 3.1 Nemotron 51b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-09-22", + "last_updated": "2024-09-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "nvidia/llama3-chatqa-1.5-70b": { + "id": "nvidia/llama3-chatqa-1.5-70b", + "name": "Llama3 Chatqa 1.5 70b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-04-28", + "last_updated": "2024-04-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "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", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "nvidia/llama-3.1-nemotron-70b-instruct": { + "id": "nvidia/llama-3.1-nemotron-70b-instruct", + "name": "Llama 3.1 Nemotron 70b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-10-12", + "last_updated": "2024-10-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "nvidia/nemotron-4-340b-instruct": { + "id": "nvidia/nemotron-4-340b-instruct", + "name": "Nemotron 4 340b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-06-13", + "last_updated": "2024-06-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "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", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-03-16", + "last_updated": "2025-03-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "minimaxai/minimax-m2": { + "id": "minimaxai/minimax-m2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-10-27", + "last_updated": "2025-10-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "google/gemma-3n-e2b-it": { + "id": "google/gemma-3n-e2b-it", + "name": "Gemma 3n E2b It", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/codegemma-1.1-7b": { + "id": "google/codegemma-1.1-7b", + "name": "Codegemma 1.1 7b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2024-04-30", + "last_updated": "2024-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-3n-e4b-it": { + "id": "google/gemma-3n-e4b-it", + "name": "Gemma 3n E4b It", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-2-2b-it": { + "id": "google/gemma-2-2b-it", + "name": "Gemma 2 2b It", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-3-12b-it": { + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12b It", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-01", + "last_updated": "2025-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/codegemma-7b": { + "id": "google/codegemma-7b", + "name": "Codegemma 7b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2024-03-21", + "last_updated": "2024-03-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-3-1b-it": { + "id": "google/gemma-3-1b-it", + "name": "Gemma 3 1b It", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-10", + "last_updated": "2025-03-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-2-27b-it": { + "id": "google/gemma-2-27b-it", + "name": "Gemma 2 27b It", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-06-24", + "last_updated": "2024-06-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google/gemma-3-27b-it": { + "id": "google/gemma-3-27b-it", + "name": "Gemma-3-27B-IT", + "family": "gemma-3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "microsoft/phi-3-medium-128k-instruct": { + "id": "microsoft/phi-3-medium-128k-instruct", + "name": "Phi 3 Medium 128k Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-05-07", + "last_updated": "2024-05-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-small-128k-instruct": { + "id": "microsoft/phi-3-small-128k-instruct", + "name": "Phi 3 Small 128k Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-05-07", + "last_updated": "2024-05-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3.5-vision-instruct": { + "id": "microsoft/phi-3.5-vision-instruct", + "name": "Phi 3.5 Vision Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-16", + "last_updated": "2024-08-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-small-8k-instruct": { + "id": "microsoft/phi-3-small-8k-instruct", + "name": "Phi 3 Small 8k Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-05-07", + "last_updated": "2024-05-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8000, "output": 4096 } + }, + "microsoft/phi-3.5-moe-instruct": { + "id": "microsoft/phi-3.5-moe-instruct", + "name": "Phi 3.5 Moe Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-17", + "last_updated": "2024-08-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-4-mini-instruct": { + "id": "microsoft/phi-4-mini-instruct", + "name": "Phi-4-Mini", + "family": "phi-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "microsoft/phi-3-medium-4k-instruct": { + "id": "microsoft/phi-3-medium-4k-instruct", + "name": "Phi 3 Medium 4k Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-05-07", + "last_updated": "2024-05-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4000, "output": 4096 } + }, + "microsoft/phi-3-vision-128k-instruct": { + "id": "microsoft/phi-3-vision-128k-instruct", + "name": "Phi 3 Vision 128k Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-05-19", + "last_updated": "2024-05-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai/whisper-large-v3": { + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3", + "family": "whisper-large", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 4096 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS-120B", + "family": "gpt-oss", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-08-04", + "last_updated": "2025-08-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "qwen/qwen3-next-80b-a3b-instruct": { + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next-80B-A3B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 16384 } + }, + "qwen/qwen2.5-coder-32b-instruct": { + "id": "qwen/qwen2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32b Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen/qwen2.5-coder-7b-instruct": { + "id": "qwen/qwen2.5-coder-7b-instruct", + "name": "Qwen2.5 Coder 7b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-09-17", + "last_updated": "2024-09-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen/qwen3-235b-a22b": { + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen3-235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen/qwen3-coder-480b-a35b-instruct": { + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 66536 } + }, + "qwen/qwq-32b": { + "id": "qwen/qwq-32b", + "name": "Qwq 32b", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen/qwen3-next-80b-a3b-thinking": { + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next-80B-A3B-Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 16384 } + }, + "mistralai/devstral-2-123b-instruct-2512": { + "id": "mistralai/devstral-2-123b-instruct-2512", + "name": "Devstral-2-123B-Instruct-2512", + "family": "devstral", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-12-08", + "last_updated": "2025-12-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/mistral-large-3-675b-instruct-2512": { + "id": "mistralai/mistral-large-3-675b-instruct-2512", + "name": "Mistral Large 3 675B Instruct 2512", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/ministral-14b-instruct-2512": { + "id": "mistralai/ministral-14b-instruct-2512", + "name": "Ministral 3 14B Instruct 2512", + "family": "ministral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/mamba-codestral-7b-v0.1": { + "id": "mistralai/mamba-codestral-7b-v0.1", + "name": "Mamba Codestral 7b V0.1", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2024-07-16", + "last_updated": "2024-07-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/mistral-large-2-instruct": { + "id": "mistralai/mistral-large-2-instruct", + "name": "Mistral Large 2 Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-07-24", + "last_updated": "2024-07-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/codestral-22b-instruct-v0.1": { + "id": "mistralai/codestral-22b-instruct-v0.1", + "name": "Codestral 22b Instruct V0.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-05-29", + "last_updated": "2024-05-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/mistral-small-3.1-24b-instruct-2503": { + "id": "mistralai/mistral-small-3.1-24b-instruct-2503", + "name": "Mistral Small 3.1 24b Instruct 2503", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-11", + "last_updated": "2025-03-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.2-11b-vision-instruct": { + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11b Vision Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama3-70b-instruct": { + "id": "meta/llama3-70b-instruct", + "name": "Llama3 70b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-04-17", + "last_updated": "2024-04-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.3-70b-instruct": { + "id": "meta/llama-3.3-70b-instruct", + "name": "Llama 3.3 70b Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.2-1b-instruct": { + "id": "meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1b Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-4-scout-17b-16e-instruct": { + "id": "meta/llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17b 16e Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-02", + "release_date": "2025-04-02", + "last_updated": "2025-04-02", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-4-maverick-17b-128e-instruct": { + "id": "meta/llama-4-maverick-17b-128e-instruct", + "name": "Llama 4 Maverick 17b 128e Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/codellama-70b": { + "id": "meta/codellama-70b", + "name": "Codellama 70b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2024-01-29", + "last_updated": "2024-01-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.1-405b-instruct": { + "id": "meta/llama-3.1-405b-instruct", + "name": "Llama 3.1 405b Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama3-8b-instruct": { + "id": "meta/llama3-8b-instruct", + "name": "Llama3 8b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-04-17", + "last_updated": "2024-04-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.1-70b-instruct": { + "id": "meta/llama-3.1-70b-instruct", + "name": "Llama 3.1 70b Instruct", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "deepseek-ai/deepseek-r1-0528": { + "id": "deepseek-ai/deepseek-r1-0528", + "name": "Deepseek R1 0528", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "deepseek-ai/deepseek-r1": { + "id": "deepseek-ai/deepseek-r1", + "name": "Deepseek R1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "deepseek-ai/deepseek-v3.1-terminus": { + "id": "deepseek-ai/deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-ai/deepseek-v3.1": { + "id": "deepseek-ai/deepseek-v3.1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-08-20", + "last_updated": "2025-08-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-ai/deepseek-coder-6.7b-instruct": { + "id": "deepseek-ai/deepseek-coder-6.7b-instruct", + "name": "Deepseek Coder 6.7b Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2023-10-29", + "last_updated": "2023-10-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "black-forest-labs/flux.1-dev": { + "id": "black-forest-labs/flux.1-dev", + "name": "FLUX.1-dev", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 0 } + } + } + }, + "cohere": { + "id": "cohere", + "env": ["COHERE_API_KEY"], + "npm": "@ai-sdk/cohere", + "name": "Cohere", + "doc": "https://docs.cohere.com/docs/models", + "models": { + "command-a-translate-08-2025": { + "id": "command-a-translate-08-2025", + "name": "Command A Translate", + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 8000, "output": 8000 } + }, + "command-a-03-2025": { + "id": "command-a-03-2025", + "name": "Command A", + "family": "command-a", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 256000, "output": 8000 } + }, + "command-r-08-2024": { + "id": "command-r-08-2024", + "name": "Command R", + "family": "command-r", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4000 } + }, + "command-r-plus-08-2024": { + "id": "command-r-plus-08-2024", + "name": "Command R+", + "family": "command-r-plus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 4000 } + }, + "command-r7b-12-2024": { + "id": "command-r7b-12-2024", + "name": "Command R7B", + "family": "command-r", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06-01", + "release_date": "2024-02-27", + "last_updated": "2024-02-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.0375, "output": 0.15 }, + "limit": { "context": 128000, "output": 4000 } + }, + "command-a-reasoning-08-2025": { + "id": "command-a-reasoning-08-2025", + "name": "Command A Reasoning", + "family": "command-a", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 256000, "output": 32000 } + }, + "command-a-vision-07-2025": { + "id": "command-a-vision-07-2025", + "name": "Command A Vision", + "family": "command-a", + "attachment": false, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 8000 } + } + } + }, + "upstage": { + "id": "upstage", + "env": ["UPSTAGE_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.upstage.ai", + "name": "Upstage", + "doc": "https://developers.upstage.ai/docs/apis/chat", + "models": { + "solar-mini": { + "id": "solar-mini", + "name": "solar-mini", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 32768, "output": 4096 } + }, + "solar-pro2": { + "id": "solar-pro2", + "name": "solar-pro2", + "family": "solar-pro", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 0.25 }, + "limit": { "context": 65536, "output": 8192 } + } + } + }, + "groq": { + "id": "groq", + "env": ["GROQ_API_KEY"], + "npm": "@ai-sdk/groq", + "name": "Groq", + "doc": "https://console.groq.com/docs/models", + "models": { + "llama-3.1-8b-instant": { + "id": "llama-3.1-8b-instant", + "name": "Llama 3.1 8B Instant", + "family": "llama-3.1", + "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, + "cost": { "input": 0.05, "output": 0.08 }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistral-saba-24b": { + "id": "mistral-saba-24b", + "name": "Mistral Saba 24B", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-02-06", + "last_updated": "2025-02-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.79, "output": 0.79 }, + "limit": { "context": 32768, "output": 32768 }, + "status": "deprecated" + }, + "llama3-8b-8192": { + "id": "llama3-8b-8192", + "name": "Llama 3 8B", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-03", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.08 }, + "limit": { "context": 8192, "output": 8192 }, + "status": "deprecated" + }, + "qwen-qwq-32b": { + "id": "qwen-qwq-32b", + "name": "Qwen QwQ 32B", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-09", + "release_date": "2024-11-27", + "last_updated": "2024-11-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.29, "output": 0.39 }, + "limit": { "context": 131072, "output": 16384 }, + "status": "deprecated" + }, + "llama3-70b-8192": { + "id": "llama3-70b-8192", + "name": "Llama 3 70B", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-03", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.59, "output": 0.79 }, + "limit": { "context": 8192, "output": 8192 }, + "status": "deprecated" + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.75, "output": 0.99 }, + "limit": { "context": 131072, "output": 8192 }, + "status": "deprecated" + }, + "llama-guard-3-8b": { + "id": "llama-guard-3-8b", + "name": "Llama Guard 3 8B", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 8192, "output": 8192 }, + "status": "deprecated" + }, + "gemma2-9b-it": { + "id": "gemma2-9b-it", + "name": "Gemma 2 9B", + "family": "gemma-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2024-06-27", + "last_updated": "2024-06-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 8192, "output": 8192 }, + "status": "deprecated" + }, + "llama-3.3-70b-versatile": { + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B Versatile", + "family": "llama-3.3", + "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, + "cost": { "input": 0.59, "output": 0.79 }, + "limit": { "context": 131072, "output": 32768 } + }, + "moonshotai/kimi-k2-instruct-0905": { + "id": "moonshotai/kimi-k2-instruct-0905", + "name": "Kimi K2 Instruct 0905", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 262144, "output": 16384 } + }, + "moonshotai/kimi-k2-instruct": { + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 16384 }, + "status": "deprecated" + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 131072, "output": 65536 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 65536 } + }, + "qwen/qwen3-32b": { + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11-08", + "release_date": "2024-12-23", + "last_updated": "2024-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.29, "output": 0.59 }, + "limit": { "context": 131072, "output": 16384 } + }, + "meta-llama/llama-4-scout-17b-16e-instruct": { + "id": "meta-llama/llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B", + "family": "llama-4-scout", + "attachment": false, + "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, + "cost": { "input": 0.11, "output": 0.34 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-4-maverick-17b-128e-instruct": { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct", + "name": "Llama 4 Maverick 17B", + "family": "llama-4-maverick", + "attachment": false, + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-guard-4-12b": { + "id": "meta-llama/llama-guard-4-12b", + "name": "Llama Guard 4 12B", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 131072, "output": 1024 } + } + } + }, + "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", + "family": "ling-1t", + "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, + "cost": { "input": 0.57, "output": 2.29 }, + "limit": { "context": 128000, "output": 32000 } + }, + "Ring-1T": { + "id": "Ring-1T", + "name": "Ring-1T", + "family": "ring-1t", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-10", + "last_updated": "2025-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.57, "output": 2.29 }, + "limit": { "context": 128000, "output": 32000 } + } + } + }, + "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-2.0-flash-001": { + "id": "gemini-2.0-flash-001", + "name": "Gemini 2.0 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1000000, "output": 8192 }, + "status": "deprecated" + }, + "claude-opus-4": { + "id": "claude-opus-4", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 80000, "output": 16000 }, + "status": "deprecated" + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-08-27", + "last_updated": "2025-08-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "claude-haiku-4.5": { + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16000 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "oswe-vscode-prime": { + "id": "oswe-vscode-prime", + "name": "Raptor Mini (Preview)", + "family": "oswe-vscode-prime", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-10", + "last_updated": "2025-11-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3.5-sonnet": { + "id": "claude-3.5-sonnet", + "name": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 90000, "output": 8192 }, + "status": "deprecated" + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-mini", + "family": "gpt-5-codex-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 100000 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-10", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 65536 }, + "status": "deprecated" + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 64000, "output": 16384 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini (Preview)", + "family": "o4-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-10", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 65536 }, + "status": "deprecated" + }, + "claude-opus-41": { + "id": "claude-opus-41", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": false, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 80000, "output": 16000 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5-mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "claude-3.7-sonnet": { + "id": "claude-3.7-sonnet", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 16384 }, + "status": "deprecated" + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-20", + "last_updated": "2025-06-05", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-max", + "family": "gpt-5-codex-max", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2025-12-04", + "last_updated": "2025-12-04", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "o3": { + "id": "o3", + "name": "o3 (Preview)", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 }, + "status": "deprecated" + }, + "claude-sonnet-4": { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16000 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "claude-3.7-sonnet-thought": { + "id": "claude-3.7-sonnet-thought", + "name": "Claude Sonnet 3.7 Thinking", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 16384 }, + "status": "deprecated" + }, + "claude-opus-4.5": { + "id": "claude-opus-4.5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "claude-sonnet-4.5": { + "id": "claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16000 } + } + } + }, + "mistral": { + "id": "mistral", + "env": ["MISTRAL_API_KEY"], + "npm": "@ai-sdk/mistral", + "name": "Mistral", + "doc": "https://docs.mistral.ai/getting-started/models/", + "models": { + "devstral-medium-2507": { + "id": "devstral-medium-2507", + "name": "Devstral Medium", + "family": "devstral-medium", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral-large-2512": { + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "open-mixtral-8x22b": { + "id": "open-mixtral-8x22b", + "name": "Mixtral 8x22B", + "family": "mixtral-8x22b", + "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, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 64000, "output": 64000 } + }, + "ministral-8b-latest": { + "id": "ministral-8b-latest", + "name": "Ministral 8B", + "family": "ministral-8b", + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 128000, "output": 128000 } + }, + "pixtral-large-latest": { + "id": "pixtral-large-latest", + "name": "Pixtral Large", + "family": "pixtral-large", + "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, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral-small-2506": { + "id": "mistral-small-2506", + "name": "Mistral Small 3.2", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 16384 } + }, + "devstral-2512": { + "id": "devstral-2512", + "name": "Devstral 2", + "family": "devstral-medium", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "ministral-3b-latest": { + "id": "ministral-3b-latest", + "name": "Ministral 3B", + "family": "ministral-3b", + "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, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 128000, "output": 128000 } + }, + "pixtral-12b": { + "id": "pixtral-12b", + "name": "Pixtral 12B", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral-medium-2505": { + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131072, "output": 131072 } + }, + "labs-devstral-small-2512": { + "id": "labs-devstral-small-2512", + "name": "Devstral Small 2", + "family": "devstral-small", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 256000 } + }, + "devstral-medium-latest": { + "id": "devstral-medium-latest", + "name": "Devstral 2", + "family": "devstral-medium", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262144, "output": 262144 } + }, + "devstral-small-2505": { + "id": "devstral-small-2505", + "name": "Devstral Small 2505", + "family": "devstral-small", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral-medium-2508": { + "id": "mistral-medium-2508", + "name": "Mistral Medium 3.1", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistral-embed": { + "id": "mistral-embed", + "name": "Mistral Embed", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8000, "output": 3072 } + }, + "mistral-small-latest": { + "id": "mistral-small-latest", + "name": "Mistral Small", + "family": "mistral-small", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2024-09-01", + "last_updated": "2024-09-04", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 16384 } + }, + "magistral-small": { + "id": "magistral-small", + "name": "Magistral Small", + "family": "magistral-small", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 128000, "output": 128000 } + }, + "devstral-small-2507": { + "id": "devstral-small-2507", + "name": "Devstral Small", + "family": "devstral-small", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 128000 } + }, + "codestral-latest": { + "id": "codestral-latest", + "name": "Codestral", + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 256000, "output": 4096 } + }, + "open-mixtral-8x7b": { + "id": "open-mixtral-8x7b", + "name": "Mixtral 8x7B", + "family": "mixtral-8x7b", + "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, + "cost": { "input": 0.7, "output": 0.7 }, + "limit": { "context": 32000, "output": 32000 } + }, + "mistral-nemo": { + "id": "mistral-nemo", + "name": "Mistral Nemo", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 128000 } + }, + "open-mistral-7b": { + "id": "open-mistral-7b", + "name": "Mistral 7B", + "family": "mistral-7b", + "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, + "cost": { "input": 0.25, "output": 0.25 }, + "limit": { "context": 8000, "output": 8000 } + }, + "mistral-large-latest": { + "id": "mistral-large-latest", + "name": "Mistral Large", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistral-medium-latest": { + "id": "mistral-medium-latest", + "name": "Mistral Medium", + "family": "mistral-medium", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 128000, "output": 16384 } + }, + "mistral-large-2411": { + "id": "mistral-large-2411", + "name": "Mistral Large 2.1", + "family": "mistral-large", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2024-11-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 131072, "output": 16384 } + }, + "magistral-medium-latest": { + "id": "magistral-medium-latest", + "name": "Magistral Medium", + "family": "magistral-medium", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 5 }, + "limit": { "context": 128000, "output": 16384 } + } + } + }, + "abacus": { + "id": "abacus", + "env": ["ABACUS_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://routellm.abacus.ai/v1/chat/completions", + "name": "Abacus", + "doc": "https://abacus.ai/help/api", + "models": { + "gpt-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 Nano", + "family": "gpt-4.1", + "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, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok-4", + "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, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 16384 } + }, + "gemini-2.0-flash-001": { + "id": "gemini-2.0-flash-001", + "name": "Gemini 2.0 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-02-05", + "last_updated": "2025-02-05", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 1000000, "output": 8192 } + }, + "deepseek-ai-DeepSeek-V3.2": { + "id": "deepseek-ai-DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-15", + "last_updated": "2025-06-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.4 }, + "limit": { "context": 128000, "output": 8192 } + }, + "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", + "family": "llama-3.1", + "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, + "cost": { "input": 3.5, "output": 3.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 0.5, "output": 3 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "Qwen-Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen-Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct", + "family": "qwen-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.6 }, + "limit": { "context": 262144, "output": 8192 } + }, + "meta-llama-Meta-Llama-3.1-8B-Instruct": { + "id": "meta-llama-Meta-Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.02, "output": 0.05 }, + "limit": { "context": 128000, "output": 4096 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok-code", + "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, + "cost": { "input": 0.2, "output": 1.5 }, + "limit": { "context": 256000, "output": 16384 } + }, + "deepseek-ai-DeepSeek-R1": { + "id": "deepseek-ai-DeepSeek-R1", + "name": "DeepSeek R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3, "output": 7 }, + "limit": { "context": 128000, "output": 8192 } + }, + "kimi-k2-turbo-preview": { + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo Preview", + "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, + "cost": { "input": 0.15, "output": 8 }, + "limit": { "context": 256000, "output": 8192 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-01", + "last_updated": "2025-06-01", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 12 }, + "limit": { "context": 1000000, "output": 65000 } + }, + "qwen-qwen3-coder-480b-a35b-instruct": { + "id": "qwen-qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen-3-coder", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.29, "output": 1.2 }, + "limit": { "context": 262144, "output": 65536 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "family": "gpt-4.1", + "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, + "cost": { "input": 0.4, "output": 1.6 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "claude-opus-4-5-20251101": { + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "qwen-2.5-coder-32b": { + "id": "qwen-2.5-coder-32b", + "name": "Qwen 2.5 Coder 32B", + "family": "qwen-2.5", + "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, + "cost": { "input": 0.79, "output": 0.79 }, + "limit": { "context": 128000, "output": 8192 } + }, + "claude-sonnet-4-5-20250929": { + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 64000 } + }, + "openai-gpt-oss-120b": { + "id": "openai-gpt-oss-120b", + "name": "GPT-OSS 120B", + "family": "gpt-oss", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.08, "output": 0.44 }, + "limit": { "context": 128000, "output": 32768 } + }, + "qwen-qwen3-Max": { + "id": "qwen-qwen3-Max", + "name": "Qwen3 Max", + "family": "qwen-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 131072, "output": 16384 } + }, + "grok-4-0709": { + "id": "grok-4-0709", + "name": "Grok 4", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 256000, "output": 16384 } + }, + "meta-llama-Meta-Llama-3.1-70B-Instruct": { + "id": "meta-llama-Meta-Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.4, "output": 0.4 }, + "limit": { "context": 128000, "output": 4096 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4 }, + "limit": { "context": 200000, "output": 100000 } + }, + "zai-org-glm-4.5": { + "id": "zai-org-glm-4.5", + "name": "GLM-4.5", + "family": "glm-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gemini-2.0-pro-exp-02-05": { + "id": "gemini-2.0-pro-exp-02-05", + "name": "Gemini 2.0 Pro Exp", + "family": "gemini-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-02-05", + "last_updated": "2025-02-05", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 2000000, "output": 8192 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4 }, + "limit": { "context": 400000, "output": 128000 } + }, + "claude-sonnet-4-20250514": { + "id": "claude-sonnet-4-20250514", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4 }, + "limit": { "context": 200000, "output": 100000 } + }, + "Qwen-Qwen3-32B": { + "id": "Qwen-Qwen3-32B", + "name": "Qwen3 32B", + "family": "qwen-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.29 }, + "limit": { "context": 128000, "output": 8192 } + }, + "claude-opus-4-20250514": { + "id": "claude-opus-4-20250514", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2 }, + "limit": { "context": 400000, "output": 128000 } + }, + "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", + "family": "llama-4", + "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, + "cost": { "input": 0.14, "output": 0.59 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "o3-pro": { + "id": "o3-pro", + "name": "o3-pro", + "family": "o3-pro", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 20, "output": 80 }, + "limit": { "context": 200000, "output": 100000 } + }, + "claude-3-7-sonnet-20250219": { + "id": "claude-3-7-sonnet-20250219", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 64000 } + }, + "deepseek-ai-DeepSeek-V3.1-Terminus": { + "id": "deepseek-ai-DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-01", + "last_updated": "2025-06-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gpt-4o-2024-11-20": { + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 16384 } + }, + "o3": { + "id": "o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 200000, "output": 100000 } + }, + "Qwen-Qwen2.5-72B-Instruct": { + "id": "Qwen-Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B Instruct", + "family": "qwen-2.5", + "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, + "cost": { "input": 0.11, "output": 0.38 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org-glm-4.6": { + "id": "zai-org-glm-4.6", + "name": "GLM-4.6", + "family": "glm-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-01", + "last_updated": "2025-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-deepseek-v3.1": { + "id": "deepseek-deepseek-v3.1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 1.66 }, + "limit": { "context": 128000, "output": 8192 } + }, + "Qwen-QwQ-32B": { + "id": "Qwen-QwQ-32B", + "name": "QwQ 32B", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2024-11-28", + "last_updated": "2024-11-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 0.4 }, + "limit": { "context": 32768, "output": 32768 } + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "grok-4-1-fast-non-reasoning": { + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "family": "grok-4.1", + "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, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 16384 } + }, + "llama-3.3-70b-versatile": { + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B Versatile", + "family": "llama-3.3", + "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, + "cost": { "input": 0.59, "output": 0.79 }, + "limit": { "context": 128000, "output": 32768 } + }, + "claude-opus-4-1-20250805": { + "id": "claude-opus-4-1-20250805", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.1-chat-latest": { + "id": "gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat Latest", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "claude-haiku-4-5-20251001": { + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 200000, "output": 64000 } + } + } + }, + "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": { + "moonshotai/kimi-k2": { + "id": "moonshotai/kimi-k2", + "name": "Kimi K2 Instruct", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 16384 }, + "status": "deprecated" + }, + "alibaba/qwen3-next-80b-a3b-instruct": { + "id": "alibaba/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-12", + "last_updated": "2025-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "alibaba/qwen3-vl-instruct": { + "id": "alibaba/qwen3-vl-instruct", + "name": "Qwen3 VL Instruct", + "family": "qwen3-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.8 }, + "limit": { "context": 131072, "output": 129024 } + }, + "alibaba/qwen3-vl-thinking": { + "id": "alibaba/qwen3-vl-thinking", + "name": "Qwen3 VL Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 8.4 }, + "limit": { "context": 131072, "output": 129024 } + }, + "alibaba/qwen3-max": { + "id": "alibaba/qwen3-max", + "name": "Qwen3 Max", + "family": "qwen3", + "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, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 262144, "output": 32768 } + }, + "alibaba/qwen3-coder-plus": { + "id": "alibaba/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "family": "qwen3-coder", + "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, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 1000000, "output": 1000000 } + }, + "alibaba/qwen3-next-80b-a3b-thinking": { + "id": "alibaba/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-12", + "last_updated": "2025-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 6 }, + "limit": { "context": 131072, "output": 32768 } + }, + "xai/grok-3-mini-fast": { + "id": "xai/grok-3-mini-fast", + "name": "Grok 3 Mini Fast", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 4, "reasoning": 4, "cache_read": 0.15 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-3-mini": { + "id": "xai/grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-4-fast": { + "id": "xai/grok-4-fast", + "name": "Grok 4 Fast", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "xai/grok-3": { + "id": "xai/grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-2": { + "id": "xai/grok-2", + "name": "Grok 2", + "family": "grok-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-code-fast-1": { + "id": "xai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "xai/grok-2-vision": { + "id": "xai/grok-2-vision", + "name": "Grok 2 Vision", + "family": "grok-2", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10, "cache_read": 2 }, + "limit": { "context": 8192, "output": 4096 } + }, + "xai/grok-4": { + "id": "xai/grok-4", + "name": "Grok 4", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "reasoning": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 64000 } + }, + "xai/grok-3-fast": { + "id": "xai/grok-3-fast", + "name": "Grok 3 Fast", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 1.25 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-4-fast-non-reasoning": { + "id": "xai/grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "mistral/codestral": { + "id": "mistral/codestral", + "name": "Codestral", + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 256000, "output": 4096 } + }, + "mistral/magistral-medium": { + "id": "mistral/magistral-medium", + "name": "Magistral Medium", + "family": "magistral-medium", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 5 }, + "limit": { "context": 128000, "output": 16384 } + }, + "mistral/mistral-large": { + "id": "mistral/mistral-large", + "name": "Mistral Large", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistral/pixtral-large": { + "id": "mistral/pixtral-large", + "name": "Pixtral Large", + "family": "pixtral-large", + "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, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral/ministral-8b": { + "id": "mistral/ministral-8b", + "name": "Ministral 8B", + "family": "ministral-8b", + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral/ministral-3b": { + "id": "mistral/ministral-3b", + "name": "Ministral 3B", + "family": "ministral-3b", + "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, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral/magistral-small": { + "id": "mistral/magistral-small", + "name": "Magistral Small", + "family": "magistral-small", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral/mistral-small": { + "id": "mistral/mistral-small", + "name": "Mistral Small", + "family": "mistral-small", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2024-09-01", + "last_updated": "2024-09-04", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 16384 } + }, + "mistral/pixtral-12b": { + "id": "mistral/pixtral-12b", + "name": "Pixtral 12B", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral/mixtral-8x22b-instruct": { + "id": "mistral/mixtral-8x22b-instruct", + "name": "Mixtral 8x22B", + "family": "mixtral-8x22b", + "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, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 64000, "output": 64000 } + }, + "vercel/v0-1.0-md": { + "id": "vercel/v0-1.0-md", + "name": "v0-1.0-md", + "family": "v0", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 128000, "output": 32000 } + }, + "vercel/v0-1.5-md": { + "id": "vercel/v0-1.5-md", + "name": "v0-1.5-md", + "family": "v0", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-09", + "last_updated": "2025-06-09", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 128000, "output": 32000 } + }, + "deepseek/deepseek-v3.2-exp-thinking": { + "id": "deepseek/deepseek-v3.2-exp-thinking", + "name": "DeepSeek V3.2 Exp Thinking", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42 }, + "limit": { "context": 163840, "output": 8192 } + }, + "deepseek/deepseek-v3.1-terminus": { + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek/deepseek-v3.2-exp": { + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek V3.2 Exp", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42 }, + "limit": { "context": 163840, "output": 8192 } + }, + "deepseek/deepseek-r1-distill-llama-70b": { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.75, "output": 0.99 }, + "limit": { "context": 131072, "output": 8192 }, + "status": "deprecated" + }, + "deepseek/deepseek-r1": { + "id": "deepseek/deepseek-r1", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 128000, "output": 32768 } + }, + "minimax/minimax-m2": { + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03, "cache_write": 0.38 }, + "limit": { "context": 205000, "output": 131072 } + }, + "google/gemini-3-pro-preview": { + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 2, + "output": 12, + "cache_read": 0.2, + "context_over_200k": { "input": 4, "output": 18, "cache_read": 0.4 } + }, + "limit": { "context": 1000000, "output": 64000 } + }, + "google/gemini-2.5-flash-lite": { + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-flash-preview-09-2025": { + "id": "google/gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09-25", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.383 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-flash-lite-preview-09-2025": { + "id": "google/gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview 09-25", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.0-flash": { + "id": "google/gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "google/gemini-2.0-flash-lite": { + "id": "google/gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "google/gemini-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.3 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o3": { + "id": "openai/o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5-mini": { + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/o1": { + "id": "openai/o1", + "name": "o1", + "family": "o1", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-4o": { + "id": "openai/gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5-codex": { + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-nano": { + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/o3-mini": { + "id": "openai/o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4-turbo": { + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai/gpt-4.1-mini": { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-4.1-nano": { + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "family": "gpt-4.1-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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "perplexity/sonar-reasoning": { + "id": "perplexity/sonar-reasoning", + "name": "Sonar Reasoning", + "family": "sonar-reasoning", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 127000, "output": 8000 } + }, + "perplexity/sonar": { + "id": "perplexity/sonar", + "name": "Sonar", + "family": "sonar", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-02", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 1 }, + "limit": { "context": 127000, "output": 8000 } + }, + "perplexity/sonar-pro": { + "id": "perplexity/sonar-pro", + "name": "Sonar Pro", + "family": "sonar-pro", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 8000 } + }, + "perplexity/sonar-reasoning-pro": { + "id": "perplexity/sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 127000, "output": 8000 } + }, + "zai/glm-4.5": { + "id": "zai/glm-4.5", + "name": "GLM 4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 96000 } + }, + "zai/glm-4.5-air": { + "id": "zai/glm-4.5-air", + "name": "GLM 4.5 Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.1 }, + "limit": { "context": 128000, "output": 96000 } + }, + "zai/glm-4.5v": { + "id": "zai/glm-4.5v", + "name": "GLM 4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 1.8 }, + "limit": { "context": 66000, "output": 16000 } + }, + "zai/glm-4.6": { + "id": "zai/glm-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 200000, "output": 96000 } + }, + "amazon/nova-micro": { + "id": "amazon/nova-micro", + "name": "Nova Micro", + "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, + "cost": { "input": 0.035, "output": 0.14, "cache_read": 0.00875 }, + "limit": { "context": 128000, "output": 8192 } + }, + "amazon/nova-pro": { + "id": "amazon/nova-pro", + "name": "Nova Pro", + "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, + "cost": { "input": 0.8, "output": 3.2, "cache_read": 0.2 }, + "limit": { "context": 300000, "output": 8192 } + }, + "amazon/nova-lite": { + "id": "amazon/nova-lite", + "name": "Nova Lite", + "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, + "cost": { "input": 0.06, "output": 0.24, "cache_read": 0.015 }, + "limit": { "context": 300000, "output": 8192 } + }, + "morph/morph-v3-fast": { + "id": "morph/morph-v3-fast", + "name": "Morph v3 Fast", + "family": "morph-v3-fast", + "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, + "cost": { "input": 0.8, "output": 1.2 }, + "limit": { "context": 16000, "output": 16000 } + }, + "morph/morph-v3-large": { + "id": "morph/morph-v3-large", + "name": "Morph v3 Large", + "family": "morph-v3-large", + "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, + "cost": { "input": 0.9, "output": 1.9 }, + "limit": { "context": 32000, "output": 32000 } + }, + "meta/llama-4-scout": { + "id": "meta/llama-4-scout", + "name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "family": "llama-4-scout", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-3.3-70b": { + "id": "meta/llama-3.3-70b", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta/llama-4-maverick": { + "id": "meta/llama-4-maverick", + "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "anthropic/claude-haiku-4.5": { + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 1.25, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-opus-4.5": { + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3.5-haiku": { + "id": "anthropic/claude-3.5-haiku", + "name": "Claude Haiku 3.5", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-3.7-sonnet": { + "id": "anthropic/claude-3.7-sonnet", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-4.5-sonnet": { + "id": "anthropic/claude-4.5-sonnet", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3.5-sonnet": { + "id": "anthropic/claude-3.5-sonnet", + "name": "Claude Sonnet 3.5 v2", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-4-1-opus": { + "id": "anthropic/claude-4-1-opus", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-4-sonnet": { + "id": "anthropic/claude-4-sonnet", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3-opus": { + "id": "anthropic/claude-3-opus", + "name": "Claude Opus 3", + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic/claude-3-haiku": { + "id": "anthropic/claude-3-haiku", + "name": "Claude Haiku 3", + "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, + "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic/claude-4-opus": { + "id": "anthropic/claude-4-opus", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + } + } + }, + "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": { + "NousResearch/hermes-4-70b": { + "id": "NousResearch/hermes-4-70b", + "name": "Hermes 4 70B", + "family": "hermes", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-08-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.13, "output": 0.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "NousResearch/hermes-4-405b": { + "id": "NousResearch/hermes-4-405b", + "name": "Hermes-4 405B", + "family": "hermes", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-08-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 8192 } + }, + "moonshotai/kimi-k2-instruct": { + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2025-01-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "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", + "family": "llama-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 1.8 }, + "limit": { "context": 131072, "output": 8192 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen/qwen3-235b-a22b-instruct-2507": { + "id": "qwen/qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262144, "output": 8192 } + }, + "qwen/qwen3-235b-a22b-thinking-2507": { + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 262144, "output": 8192 } + }, + "qwen/qwen3-coder-480b-a35b-instruct": { + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 1.8 }, + "limit": { "context": 262144, "output": 66536 } + }, + "meta-llama/llama-3_1-405b-instruct": { + "id": "meta-llama/llama-3_1-405b-instruct", + "name": "Llama 3.1 405B Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-07-23", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-3.3-70b-instruct-fast": { + "id": "meta-llama/llama-3.3-70b-instruct-fast", + "name": "Llama-3.3-70B-Instruct (Fast)", + "family": "llama-3.3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-22", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-3.3-70b-instruct-base": { + "id": "meta-llama/llama-3.3-70b-instruct-base", + "name": "Llama-3.3-70B-Instruct (Base)", + "family": "llama-3.3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-22", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.13, "output": 0.4 }, + "limit": { "context": 131072, "output": 8192 } + }, + "zai-org/glm-4.5": { + "id": "zai-org/glm-4.5", + "name": "GLM 4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2024-06-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "zai-org/glm-4.5-air": { + "id": "zai-org/glm-4.5-air", + "name": "GLM 4.5 Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2024-06-01", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 1.2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "deepseek-ai/deepseek-v3": { + "id": "deepseek-ai/deepseek-v3", + "name": "DeepSeek V3", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-05-07", + "last_updated": "2025-10-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 131072, "output": 8192 } + } + } + }, + "deepseek": { + "id": "deepseek", + "env": ["DEEPSEEK_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.deepseek.com", + "name": "DeepSeek", + "doc": "https://platform.deepseek.com/api-docs/pricing", + "models": { + "deepseek-chat": { + "id": "deepseek-chat", + "name": "DeepSeek Chat", + "family": "deepseek-chat", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-reasoner": { + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "family": "deepseek", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "limit": { "context": 128000, "output": 128000 } + } + } + }, + "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": { + "deepseek-r1-distill-qwen-7b": { + "id": "deepseek-r1-distill-qwen-7b", + "name": "DeepSeek R1 Distill Qwen 7B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.072, "output": 0.144 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen3-asr-flash": { + "id": "qwen3-asr-flash", + "name": "Qwen3-ASR Flash", + "family": "qwen3", + "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, + "cost": { "input": 0.032, "output": 0.032 }, + "limit": { "context": 53248, "output": 4096 } + }, + "deepseek-r1-0528": { + "id": "deepseek-r1-0528", + "name": "DeepSeek R1 0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.574, "output": 2.294 }, + "limit": { "context": 131072, "output": 16384 } + }, + "deepseek-v3": { + "id": "deepseek-v3", + "name": "DeepSeek V3", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.287, "output": 1.147 }, + "limit": { "context": 65536, "output": 8192 } + }, + "qwen-omni-turbo": { + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "family": "qwen-omni", + "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, + "cost": { "input": 0.058, "output": 0.23, "input_audio": 3.584, "output_audio": 7.168 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-vl-max": { + "id": "qwen-vl-max", + "name": "Qwen-VL Max", + "family": "qwen-vl", + "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, + "cost": { "input": 0.23, "output": 0.574 }, + "limit": { "context": 131072, "output": 8192 } + }, + "deepseek-v3-2-exp": { + "id": "deepseek-v3-2-exp", + "name": "DeepSeek V3.2 Exp", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.287, "output": 0.431 }, + "limit": { "context": 131072, "output": 65536 } + }, + "qwen3-next-80b-a3b-instruct": { + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.144, "output": 0.574 }, + "limit": { "context": 131072, "output": 32768 } + }, + "deepseek-r1": { + "id": "deepseek-r1", + "name": "DeepSeek R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.574, "output": 2.294 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen-turbo": { + "id": "qwen-turbo", + "name": "Qwen Turbo", + "family": "qwen-turbo", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.044, "output": 0.087, "reasoning": 0.431 }, + "limit": { "context": 1000000, "output": 16384 } + }, + "qwen3-vl-235b-a22b": { + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3-VL 235B-A22B", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.286705, "output": 1.14682, "reasoning": 2.867051 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen3-coder-flash": { + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.144, "output": 0.574 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "qwen3-vl-30b-a3b": { + "id": "qwen3-vl-30b-a3b", + "name": "Qwen3-VL 30B-A3B", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.108, "output": 0.431, "reasoning": 1.076 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen3-14b": { + "id": "qwen3-14b", + "name": "Qwen3 14B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.144, "output": 0.574, "reasoning": 1.434 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qvq-max": { + "id": "qvq-max", + "name": "QVQ Max", + "family": "qvq-max", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.147, "output": 4.588 }, + "limit": { "context": 131072, "output": 8192 } + }, + "deepseek-r1-distill-qwen-32b": { + "id": "deepseek-r1-distill-qwen-32b", + "name": "DeepSeek R1 Distill Qwen 32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen-plus-character": { + "id": "qwen-plus-character", + "name": "Qwen Plus Character", + "family": "qwen-plus", + "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, + "cost": { "input": 0.115, "output": 0.287 }, + "limit": { "context": 32768, "output": 4096 } + }, + "qwen2-5-14b-instruct": { + "id": "qwen2-5-14b-instruct", + "name": "Qwen2.5 14B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.144, "output": 0.431 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwq-plus": { + "id": "qwq-plus", + "name": "QwQ Plus", + "family": "qwq", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.23, "output": 0.574 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-coder-32b-instruct": { + "id": "qwen2-5-coder-32b-instruct", + "name": "Qwen2.5-Coder 32B Instruct", + "family": "qwen2.5-coder", + "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, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-coder-30b-a3b-instruct": { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.216, "output": 0.861 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen-math-plus": { + "id": "qwen-math-plus", + "name": "Qwen Math Plus", + "family": "qwen-math", + "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, + "cost": { "input": 0.574, "output": 1.721 }, + "limit": { "context": 4096, "output": 3072 } + }, + "qwen-vl-ocr": { + "id": "qwen-vl-ocr", + "name": "Qwen-VL OCR", + "family": "qwen-vl", + "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, + "cost": { "input": 0.717, "output": 0.717 }, + "limit": { "context": 34096, "output": 4096 } + }, + "qwen-doc-turbo": { + "id": "qwen-doc-turbo", + "name": "Qwen Doc Turbo", + "family": "qwen-doc", + "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, + "cost": { "input": 0.087, "output": 0.144 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen-deep-research": { + "id": "qwen-deep-research", + "name": "Qwen Deep Research", + "family": "qwen-deep-research", + "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, + "cost": { "input": 7.742, "output": 23.367 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen2-5-72b-instruct": { + "id": "qwen2-5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.574, "output": 1.721 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-omni-flash": { + "id": "qwen3-omni-flash", + "name": "Qwen3-Omni Flash", + "family": "qwen3-omni", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.058, "output": 0.23, "input_audio": 3.584, "output_audio": 7.168 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen-flash": { + "id": "qwen-flash", + "name": "Qwen Flash", + "family": "qwen-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.022, "output": 0.216 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen3-8b": { + "id": "qwen3-8b", + "name": "Qwen3 8B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.072, "output": 0.287, "reasoning": 0.717 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-omni-flash-realtime": { + "id": "qwen3-omni-flash-realtime", + "name": "Qwen3-Omni Flash Realtime", + "family": "qwen3-omni", + "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, + "cost": { "input": 0.23, "output": 0.918, "input_audio": 3.584, "output_audio": 7.168 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen2-5-vl-72b-instruct": { + "id": "qwen2-5-vl-72b-instruct", + "name": "Qwen2.5-VL 72B Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 2.294, "output": 6.881 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-vl-plus": { + "id": "qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "family": "qwen3-vl", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.143353, "output": 1.433525, "reasoning": 4.300576 }, + "limit": { "context": 262144, "output": 32768 } + }, + "qwen-plus": { + "id": "qwen-plus", + "name": "Qwen Plus", + "family": "qwen-plus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.115, "output": 0.287, "reasoning": 1.147 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen2-5-32b-instruct": { + "id": "qwen2-5-32b-instruct", + "name": "Qwen2.5 32B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-omni-7b": { + "id": "qwen2-5-omni-7b", + "name": "Qwen2.5-Omni 7B", + "family": "qwen2.5-omni", + "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, + "cost": { "input": 0.087, "output": 0.345, "input_audio": 5.448 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-max": { + "id": "qwen-max", + "name": "Qwen Max", + "family": "qwen-max", + "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, + "cost": { "input": 0.345, "output": 1.377 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen-long": { + "id": "qwen-long", + "name": "Qwen Long", + "family": "qwen-long", + "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, + "cost": { "input": 0.072, "output": 0.287 }, + "limit": { "context": 10000000, "output": 8192 } + }, + "qwen2-5-math-72b-instruct": { + "id": "qwen2-5-math-72b-instruct", + "name": "Qwen2.5-Math 72B Instruct", + "family": "qwen2.5-math", + "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, + "cost": { "input": 0.574, "output": 1.721 }, + "limit": { "context": 4096, "output": 3072 } + }, + "moonshot-kimi-k2-instruct": { + "id": "moonshot-kimi-k2-instruct", + "name": "Moonshot Kimi K2 Instruct", + "family": "kimi-k2", + "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, + "cost": { "input": 0.574, "output": 2.294 }, + "limit": { "context": 131072, "output": 131072 } + }, + "tongyi-intent-detect-v3": { + "id": "tongyi-intent-detect-v3", + "name": "Tongyi Intent Detect V3", + "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, + "cost": { "input": 0.058, "output": 0.144 }, + "limit": { "context": 8192, "output": 1024 } + }, + "qwen2-5-7b-instruct": { + "id": "qwen2-5-7b-instruct", + "name": "Qwen2.5 7B Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.072, "output": 0.144 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-vl-7b-instruct": { + "id": "qwen2-5-vl-7b-instruct", + "name": "Qwen2.5-VL 7B Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 0.287, "output": 0.717 }, + "limit": { "context": 131072, "output": 8192 } + }, + "deepseek-v3-1": { + "id": "deepseek-v3-1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.574, "output": 1.721 }, + "limit": { "context": 131072, "output": 65536 } + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen3-235b-a22b": { + "id": "qwen3-235b-a22b", + "name": "Qwen3 235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.287, "output": 1.147, "reasoning": 2.868 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen2-5-coder-7b-instruct": { + "id": "qwen2-5-coder-7b-instruct", + "name": "Qwen2.5-Coder 7B Instruct", + "family": "qwen2.5-coder", + "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, + "cost": { "input": 0.144, "output": 0.287 }, + "limit": { "context": 131072, "output": 8192 } + }, + "deepseek-r1-distill-qwen-14b": { + "id": "deepseek-r1-distill-qwen-14b", + "name": "DeepSeek R1 Distill Qwen 14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.144, "output": 0.431 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen-omni-turbo-realtime": { + "id": "qwen-omni-turbo-realtime", + "name": "Qwen-Omni Turbo Realtime", + "family": "qwen-omni", + "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, + "cost": { "input": 0.23, "output": 0.918, "input_audio": 3.584, "output_audio": 7.168 }, + "limit": { "context": 32768, "output": 2048 } + }, + "qwen-math-turbo": { + "id": "qwen-math-turbo", + "name": "Qwen Math Turbo", + "family": "qwen-math", + "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, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 4096, "output": 3072 } + }, + "qwen-mt-turbo": { + "id": "qwen-mt-turbo", + "name": "Qwen-MT Turbo", + "family": "qwen-mt", + "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, + "cost": { "input": 0.101, "output": 0.28 }, + "limit": { "context": 16384, "output": 8192 } + }, + "deepseek-r1-distill-llama-8b": { + "id": "deepseek-r1-distill-llama-8b", + "name": "DeepSeek R1 Distill Llama 8B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.861, "output": 3.441 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen-mt-plus": { + "id": "qwen-mt-plus", + "name": "Qwen-MT Plus", + "family": "qwen-mt", + "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, + "cost": { "input": 0.259, "output": 0.775 }, + "limit": { "context": 16384, "output": 8192 } + }, + "qwen3-max": { + "id": "qwen3-max", + "name": "Qwen3 Max", + "family": "qwen3", + "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, + "cost": { "input": 0.861, "output": 3.441 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwq-32b": { + "id": "qwq-32b", + "name": "QwQ 32B", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-12", + "last_updated": "2024-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.287, "output": 0.861 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen2-5-math-7b-instruct": { + "id": "qwen2-5-math-7b-instruct", + "name": "Qwen2.5-Math 7B Instruct", + "family": "qwen2.5-math", + "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, + "cost": { "input": 0.144, "output": 0.287 }, + "limit": { "context": 4096, "output": 3072 } + }, + "qwen3-next-80b-a3b-thinking": { + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.144, "output": 1.434 }, + "limit": { "context": 131072, "output": 32768 } + }, + "deepseek-r1-distill-qwen-1-5b": { + "id": "deepseek-r1-distill-qwen-1-5b", + "name": "DeepSeek R1 Distill Qwen 1.5B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 16384 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.287, "output": 1.147, "reasoning": 2.868 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen-vl-plus": { + "id": "qwen-vl-plus", + "name": "Qwen-VL Plus", + "family": "qwen-vl", + "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, + "cost": { "input": 0.115, "output": 0.287 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-coder-plus": { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "family": "qwen3-coder", + "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, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 1048576, "output": 65536 } + } + } + }, + "google-vertex-anthropic": { + "id": "google-vertex-anthropic", + "env": ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], + "npm": "@ai-sdk/google-vertex", + "name": "Vertex (Anthropic)", + "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", + "models": { + "claude-opus-4-5@20251101": { + "id": "claude-opus-4-5@20251101", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-5-sonnet@20241022": { + "id": "claude-3-5-sonnet@20241022", + "name": "Claude Sonnet 3.5 v2", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-3-5-haiku@20241022": { + "id": "claude-3-5-haiku@20241022", + "name": "Claude Haiku 3.5", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-sonnet-4@20250514": { + "id": "claude-sonnet-4@20250514", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-sonnet-4-5@20250929": { + "id": "claude-sonnet-4-5@20250929", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4-1@20250805": { + "id": "claude-opus-4-1@20250805", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "claude-haiku-4-5@20251001": { + "id": "claude-haiku-4-5@20251001", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-7-sonnet@20250219": { + "id": "claude-3-7-sonnet@20250219", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4@20250514": { + "id": "claude-opus-4@20250514", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + } + } + }, + "venice": { + "id": "venice", + "env": ["VENICE_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.venice.ai/api/v1", + "name": "Venice AI", + "doc": "https://docs.venice.ai", + "models": { + "grok-41-fast": { + "id": "grok-41-fast", + "name": "Grok 4.1 Fast", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.25, "cache_read": 0.125 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen3-235b-a22b-instruct-2507": { + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen 3 235B A22B Instruct 2507", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-04-29", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.75 }, + "limit": { "context": 131072, "output": 32768 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-12-19", + "last_updated": "2025-12-30", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.7, "output": 3.75, "cache_read": 0.07 }, + "limit": { "context": 262144, "output": 65536 } + }, + "claude-opus-45": { + "id": "claude-opus-45", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-12-06", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 6, "output": 30, "cache_read": 0.6 }, + "limit": { "context": 202752, "output": 50688 } + }, + "mistral-31-24b": { + "id": "mistral-31-24b", + "name": "Venice Medium", + "family": "mistral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2025-03-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2026-01-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1.87, "cache_read": 0.03 }, + "limit": { "context": 262144, "output": 65536 } + }, + "zai-org-glm-4.7": { + "id": "zai-org-glm-4.7", + "name": "GLM 4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-24", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.85, "output": 2.75 }, + "limit": { "context": 131072, "output": 32768 } + }, + "venice-uncensored": { + "id": "venice-uncensored", + "name": "Venice Uncensored 1.1", + "family": "venice-uncensored", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2025-03-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.9 }, + "limit": { "context": 32768, "output": 8192 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-12-02", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.5, "output": 15, "cache_read": 0.625 }, + "limit": { "context": 202752, "output": 50688 } + }, + "openai-gpt-52": { + "id": "openai-gpt-52", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-08-31", + "release_date": "2025-12-13", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.19, "output": 17.5, "cache_read": 0.219 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen3-4b": { + "id": "qwen3-4b", + "name": "Venice Small", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-04-29", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.15 }, + "limit": { "context": 32768, "output": 8192 } + }, + "llama-3.3-70b": { + "id": "llama-3.3-70b", + "name": "Llama 3.3 70B", + "family": "llama-3.3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2025-04-06", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.8 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai-gpt-oss-120b": { + "id": "openai-gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "family": "openai-gpt-oss", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-11-06", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.3 }, + "limit": { "context": 131072, "output": 32768 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-12-10", + "last_updated": "2025-12-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.75, "output": 3.2, "cache_read": 0.375 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen3-235b-a22b-thinking-2507": { + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen 3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-04-29", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.45, "output": 3.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "llama-3.2-3b": { + "id": "llama-3.2-3b", + "name": "Llama 3.2 3B", + "family": "llama-3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-10-03", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 32768 } + }, + "google-gemma-3-27b-it": { + "id": "google-gemma-3-27b-it", + "name": "Google Gemma 3 27B Instruct", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-11-04", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.12, "output": 0.2 }, + "limit": { "context": 202752, "output": 50688 } + }, + "hermes-3-llama-3.1-405b": { + "id": "hermes-3-llama-3.1-405b", + "name": "Hermes 3 Llama 3.1 405b", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-25", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.1, "output": 3 }, + "limit": { "context": 131072, "output": 32768 } + }, + "zai-org-glm-4.6v": { + "id": "zai-org-glm-4.6v", + "name": "GLM 4.6V", + "family": "glm-4.6", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-11", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.39, "output": 1.13 }, + "limit": { "context": 131072, "output": 32768 } + }, + "minimax-m21": { + "id": "minimax-m21", + "name": "MiniMax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2026-01-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.04 }, + "limit": { "context": 202752, "output": 50688 } + }, + "qwen3-next-80b": { + "id": "qwen3-next-80b", + "name": "Qwen 3 Next 80b", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-04-29", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 1.9 }, + "limit": { "context": 262144, "output": 65536 } + }, + "zai-org-glm-4.6": { + "id": "zai-org-glm-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-10-18", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.85, "output": 2.75 }, + "limit": { "context": 202752, "output": 50688 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen 3 Coder 480b", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-04-29", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.75, "output": 3 }, + "limit": { "context": 262144, "output": 65536 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-10", + "release_date": "2025-12-04", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 1, "cache_read": 0.2 }, + "limit": { "context": 163840, "output": 40960 } + } + } + }, + "siliconflow-cn": { + "id": "siliconflow-cn", + "env": ["SILICONFLOW_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.siliconflow.cn/v1", + "name": "SiliconFlow (China)", + "doc": "https://cloud.siliconflow.com/models", + "models": { + "inclusionAI/Ring-flash-2.0": { + "id": "inclusionAI/Ring-flash-2.0", + "name": "inclusionAI/Ring-flash-2.0", + "family": "inclusionai-ring-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "inclusionAI/Ling-flash-2.0": { + "id": "inclusionAI/Ling-flash-2.0", + "name": "inclusionAI/Ling-flash-2.0", + "family": "inclusionai-ling-flash", + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "inclusionAI/Ling-mini-2.0": { + "id": "inclusionAI/Ling-mini-2.0", + "name": "inclusionAI/Ling-mini-2.0", + "family": "inclusionai-ling-mini", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-10", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 131000, "output": 131000 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "moonshotai/Kimi-K2-Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-07", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.55, "output": 2.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-08", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262000, "output": 262000 } + }, + "moonshotai/Kimi-Dev-72B": { + "id": "moonshotai/Kimi-Dev-72B", + "name": "moonshotai/Kimi-Dev-72B", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-19", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 1.15 }, + "limit": { "context": 131000, "output": 131000 } + }, + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "moonshotai/Kimi-K2-Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.58, "output": 2.29 }, + "limit": { "context": 131000, "output": 131000 } + }, + "tencent/Hunyuan-A13B-Instruct": { + "id": "tencent/Hunyuan-A13B-Instruct", + "name": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "tencent/Hunyuan-MT-7B": { + "id": "tencent/Hunyuan-MT-7B", + "name": "tencent/Hunyuan-MT-7B", + "family": "hunyuan", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 33000, "output": 33000 } + }, + "MiniMaxAI/MiniMax-M1-80k": { + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMaxAI/MiniMax-M1-80k", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-17", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.55, "output": 2.2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "MiniMaxAI/MiniMax-M2": { + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMaxAI/MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 197000, "output": 131000 } + }, + "THUDM/GLM-Z1-32B-0414": { + "id": "THUDM/GLM-Z1-32B-0414", + "name": "THUDM/GLM-Z1-32B-0414", + "family": "glm-z1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "THUDM/GLM-4-9B-0414": { + "id": "THUDM/GLM-4-9B-0414", + "name": "THUDM/GLM-4-9B-0414", + "family": "glm-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.086, "output": 0.086 }, + "limit": { "context": 33000, "output": 33000 } + }, + "THUDM/GLM-Z1-9B-0414": { + "id": "THUDM/GLM-Z1-9B-0414", + "name": "THUDM/GLM-Z1-9B-0414", + "family": "glm-z1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.086, "output": 0.086 }, + "limit": { "context": 131000, "output": 131000 } + }, + "THUDM/GLM-4.1V-9B-Thinking": { + "id": "THUDM/GLM-4.1V-9B-Thinking", + "name": "THUDM/GLM-4.1V-9B-Thinking", + "family": "glm-4v", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.035, "output": 0.14 }, + "limit": { "context": 66000, "output": 66000 } + }, + "THUDM/GLM-4-32B-0414": { + "id": "THUDM/GLM-4-32B-0414", + "name": "THUDM/GLM-4-32B-0414", + "family": "glm-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.27 }, + "limit": { "context": 33000, "output": 33000 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "openai/gpt-oss-120b", + "family": "openai-gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.45 }, + "limit": { "context": 131000, "output": 8000 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "openai/gpt-oss-20b", + "family": "openai-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, + "cost": { "input": 0.04, "output": 0.18 }, + "limit": { "context": 131000, "output": 8000 } + }, + "stepfun-ai/step3": { + "id": "stepfun-ai/step3", + "name": "stepfun-ai/step3", + "family": "stepfun-ai-step3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-06", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.57, "output": 1.42 }, + "limit": { "context": 66000, "output": 66000 } + }, + "nex-agi/DeepSeek-V3.1-Nex-N1": { + "id": "nex-agi/DeepSeek-V3.1-Nex-N1", + "name": "nex-agi/DeepSeek-V3.1-Nex-N1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "baidu/ERNIE-4.5-300B-A47B": { + "id": "baidu/ERNIE-4.5-300B-A47B", + "name": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie-4", + "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, + "cost": { "input": 0.28, "output": 1.1 }, + "limit": { "context": 131000, "output": 131000 } + }, + "z-ai/GLM-4.5-Air": { + "id": "z-ai/GLM-4.5-Air", + "name": "z-ai/GLM-4.5-Air", + "family": "glm-4.5-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, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 131000, "output": 131000 } + }, + "z-ai/GLM-4.5": { + "id": "z-ai/GLM-4.5", + "name": "z-ai/GLM-4.5", + "family": "glm-4.5", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "ByteDance-Seed/Seed-OSS-36B-Instruct": { + "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "bytedance-seed-seed-oss", + "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, + "cost": { "input": 0.21, "output": 0.57 }, + "limit": { "context": 262000, "output": 262000 } + }, + "meta-llama/Meta-Llama-3.1-8B-Instruct": { + "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "name": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-23", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.06, "output": 0.06 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-Next-80B-A3B-Thinking": { + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-25", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen2.5-14B-Instruct": { + "id": "Qwen/Qwen2.5-14B-Instruct", + "name": "Qwen/Qwen2.5-14B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-32B-Instruct": { + "id": "Qwen/Qwen3-VL-32B-Instruct", + "name": "Qwen/Qwen3-VL-32B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Thinking": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "family": "qwen3-omni", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.13, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-32B-Thinking": { + "id": "Qwen/Qwen3-VL-32B-Thinking", + "name": "Qwen/Qwen3-VL-32B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-30B-A3B-Thinking": { + "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.29, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-30B-A3B-Instruct-2507": { + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "family": "qwen3", + "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, + "cost": { "input": 0.09, "output": 0.3 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-235B-A22B-Thinking": { + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.45, "output": 3.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-235B-A22B-Instruct": { + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-8B-Instruct": { + "id": "Qwen/Qwen3-VL-8B-Instruct", + "name": "Qwen/Qwen3-VL-8B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.18, "output": 0.68 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-32B": { + "id": "Qwen/Qwen3-32B", + "name": "Qwen/Qwen3-32B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-VL-7B-Instruct": { + "id": "Qwen/Qwen2.5-VL-7B-Instruct", + "name": "Qwen/Qwen2.5-VL-7B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/QwQ-32B": { + "id": "Qwen/QwQ-32B", + "name": "Qwen/QwQ-32B", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-06", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.58 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-VL-72B-Instruct": { + "id": "Qwen/Qwen2.5-VL-72B-Instruct", + "name": "Qwen/Qwen2.5-VL-72B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 131000, "output": 4000 } + }, + "Qwen/Qwen3-235B-A22B": { + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen/Qwen3-235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.35, "output": 1.42 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-7B-Instruct": { + "id": "Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen/Qwen2.5-7B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-Coder-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen2.5-72B-Instruct": { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen/Qwen2.5-72B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen2.5-72B-Instruct-128K": { + "id": "Qwen/Qwen2.5-72B-Instruct-128K", + "name": "Qwen/Qwen2.5-72B-Instruct-128K", + "family": "qwen2.5", + "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, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 131000, "output": 4000 } + }, + "Qwen/Qwen2.5-32B-Instruct": { + "id": "Qwen/Qwen2.5-32B-Instruct", + "name": "Qwen/Qwen2.5-32B-Instruct", + "family": "qwen2.5", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-09-19", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen2.5-Coder-32B-Instruct": { + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen/Qwen2.5-Coder-32B-Instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-11-11", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-23", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.09, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-8B-Thinking": { + "id": "Qwen/Qwen3-VL-8B-Thinking", + "name": "Qwen/Qwen3-VL-8B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.18, "output": 2 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "family": "qwen3-omni", + "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", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen3-8B": { + "id": "Qwen/Qwen3-8B", + "name": "Qwen/Qwen3-8B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.06, "output": 0.06 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Captioner": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "family": "qwen3-omni", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen2.5-VL-32B-Instruct": { + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen/Qwen2.5-VL-32B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-24", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.27 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-14B": { + "id": "Qwen/Qwen3-14B", + "name": "Qwen/Qwen3-14B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-VL-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.29, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-30B-A3B-Thinking-2507": { + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.09, "output": 0.3 }, + "limit": { "context": 262000, "output": 131000 } + }, + "Qwen/Qwen3-30B-A3B": { + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen/Qwen3-30B-A3B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.09, "output": 0.45 }, + "limit": { "context": 131000, "output": 131000 } + }, + "zai-org/GLM-4.5-Air": { + "id": "zai-org/GLM-4.5-Air", + "name": "zai-org/GLM-4.5-Air", + "family": "glm-4.5-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, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 131000, "output": 131000 } + }, + "zai-org/GLM-4.5V": { + "id": "zai-org/GLM-4.5V", + "name": "zai-org/GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 66000, "output": 66000 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "zai-org/GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.9 }, + "limit": { "context": 205000, "output": 205000 } + }, + "zai-org/GLM-4.5": { + "id": "zai-org/GLM-4.5", + "name": "zai-org/GLM-4.5", + "family": "glm-4.5", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/DeepSeek-V3.1": { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "deepseek-ai/DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-V3": { + "id": "deepseek-ai/DeepSeek-V3", + "name": "deepseek-ai/DeepSeek-V3", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 16000 } + }, + "deepseek-ai/DeepSeek-V3.1-Terminus": { + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-V3.2-Exp": { + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "deepseek-ai/DeepSeek-V3.2-Exp", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 0.41 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/deepseek-vl2": { + "id": "deepseek-ai/deepseek-vl2", + "name": "deepseek-ai/deepseek-vl2", + "family": "deepseek", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-12-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 4000, "output": 4000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/DeepSeek-R1": { + "id": "deepseek-ai/DeepSeek-R1", + "name": "deepseek-ai/DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.5, "output": 2.18 }, + "limit": { "context": 164000, "output": 164000 } + } + } + }, + "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": { + "NousResearch/Hermes-4.3-36B": { + "id": "NousResearch/Hermes-4.3-36B", + "name": "Hermes 4.3 36B", + "family": "nousresearch", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.1, + "output": 0.39, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "NousResearch/Hermes-4-70B": { + "id": "NousResearch/Hermes-4-70B", + "name": "Hermes 4 70B", + "family": "nousresearch", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.11, + "output": 0.38, + "reasoning": 0.5700000000000001, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "NousResearch/Hermes-4-14B": { + "id": "NousResearch/Hermes-4-14B", + "name": "Hermes 4 14B", + "family": "nousresearch", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.01, + "output": 0.05, + "reasoning": 0.07500000000000001, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "NousResearch/Hermes-4-405B-FP8-TEE": { + "id": "NousResearch/Hermes-4-405B-FP8-TEE", + "name": "Hermes 4 405B FP8 TEE", + "family": "nousresearch", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "limit": { "context": 40960, "output": 40960 } + }, + "NousResearch/Hermes-4-405B-FP8": { + "id": "NousResearch/Hermes-4-405B-FP8", + "name": "Hermes 4 405B FP8", + "family": "nousresearch", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "NousResearch/DeepHermes-3-Mistral-24B-Preview": { + "id": "NousResearch/DeepHermes-3-Mistral-24B-Preview", + "name": "DeepHermes 3 Mistral 24B Preview", + "family": "nousresearch", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.02, + "output": 0.1, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "rednote-hilab/dots.ocr": { + "id": "rednote-hilab/dots.ocr", + "name": "dots.ocr", + "family": "rednote-hilab", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.01, + "output": 0.01, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct 0905", + "family": "moonshotai", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.39, + "output": 1.9, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/Kimi-K2-Thinking-TEE": { + "id": "moonshotai/Kimi-K2-Thinking-TEE", + "name": "Kimi K2 Thinking TEE", + "family": "moonshotai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.4, + "output": 1.75, + "reasoning": 2.625, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 65535 } + }, + "MiniMaxAI/MiniMax-M2": { + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMax M2", + "family": "minimaxai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.26, + "output": 1.02, + "reasoning": 1.53, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 196608, "output": 196608 } + }, + "MiniMaxAI/MiniMax-M2.1-TEE": { + "id": "MiniMaxAI/MiniMax-M2.1-TEE", + "name": "MiniMax M2.1 TEE", + "family": "minimaxai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 196608, "output": 65536 } + }, + "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": { + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", + "name": "NVIDIA Nemotron 3 Nano 30B A3B BF16", + "family": "nvidia", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.06, + "output": 0.24, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "ArliAI/QwQ-32B-ArliAI-RpR-v1": { + "id": "ArliAI/QwQ-32B-ArliAI-RpR-v1", + "name": "QwQ 32B ArliAI RpR v1", + "family": "arliai", + "attachment": false, + "reasoning": true, + "tool_call": false, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.11, + "reasoning": 0.165, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "tngtech/DeepSeek-R1T-Chimera": { + "id": "tngtech/DeepSeek-R1T-Chimera", + "name": "DeepSeek R1T Chimera", + "family": "tngtech", + "attachment": false, + "reasoning": true, + "tool_call": false, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 163840 } + }, + "tngtech/DeepSeek-TNG-R1T2-Chimera": { + "id": "tngtech/DeepSeek-TNG-R1T2-Chimera", + "name": "DeepSeek TNG R1T2 Chimera", + "family": "tngtech", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 163840 } + }, + "tngtech/TNG-R1T-Chimera-TEE": { + "id": "tngtech/TNG-R1T-Chimera-TEE", + "name": "TNG R1T Chimera TEE", + "family": "tngtech", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + }, + "XiaomiMiMo/MiMo-V2-Flash": { + "id": "XiaomiMiMo/MiMo-V2-Flash", + "name": "MiMo V2 Flash", + "family": "xiaomimimo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.17, + "output": 0.65, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "OpenGVLab/InternVL3-78B": { + "id": "OpenGVLab/InternVL3-78B", + "name": "InternVL3 78B", + "family": "opengvlab", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.1, + "output": 0.39, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "openai/gpt-oss-120b-TEE": { + "id": "openai/gpt-oss-120b-TEE", + "name": "gpt oss 120b TEE", + "family": "openai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.04, + "output": 0.25, + "reasoning": 0.375, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 65536 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "gpt oss 20b", + "family": "openai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.02, + "output": 0.1, + "reasoning": 0.15000000000000002, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "chutesai/Mistral-Small-3.1-24B-Instruct-2503": { + "id": "chutesai/Mistral-Small-3.1-24B-Instruct-2503", + "name": "Mistral Small 3.1 24B Instruct 2503", + "family": "chutesai", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.11, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "chutesai/Mistral-Small-3.2-24B-Instruct-2506": { + "id": "chutesai/Mistral-Small-3.2-24B-Instruct-2506", + "name": "Mistral Small 3.2 24B Instruct 2506", + "family": "chutesai", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.06, + "output": 0.18, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B": { + "id": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", + "name": "Tongyi DeepResearch 30B A3B", + "family": "alibaba-nlp", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.1, + "output": 0.39, + "reasoning": 0.585, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistralai/Devstral-2-123B-Instruct-2512": { + "id": "mistralai/Devstral-2-123B-Instruct-2512", + "name": "Devstral 2 123B Instruct 2512", + "family": "mistralai", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.05, + "output": 0.22, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 65536 } + }, + "unsloth/Mistral-Nemo-Instruct-2407": { + "id": "unsloth/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "family": "unsloth", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.02, + "output": 0.04, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "unsloth/gemma-3-4b-it": { + "id": "unsloth/gemma-3-4b-it", + "name": "gemma 3 4b it", + "family": "unsloth", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.01, + "output": 0.03, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 96000, "output": 96000 } + }, + "unsloth/Mistral-Small-24B-Instruct-2501": { + "id": "unsloth/Mistral-Small-24B-Instruct-2501", + "name": "Mistral Small 24B Instruct 2501", + "family": "unsloth", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.11, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "unsloth/gemma-3-12b-it": { + "id": "unsloth/gemma-3-12b-it", + "name": "gemma 3 12b it", + "family": "unsloth", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.1, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "unsloth/gemma-3-27b-it": { + "id": "unsloth/gemma-3-27b-it", + "name": "gemma 3 27b it", + "family": "unsloth", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.04, + "output": 0.15, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 96000, "output": 96000 } + }, + "Qwen/Qwen3-30B-A3B": { + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen3 30B A3B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.06, + "output": 0.22, + "reasoning": 0.33, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen3-14B": { + "id": "Qwen/Qwen3-14B", + "name": "Qwen3 14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.05, + "output": 0.22, + "reasoning": 0.33, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen2.5-VL-32B-Instruct": { + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen2.5 VL 32B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.05, + "output": 0.22, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 16384, "output": 16384 } + }, + "Qwen/Qwen3Guard-Gen-0.6B": { + "id": "Qwen/Qwen3Guard-Gen-0.6B", + "name": "Qwen3Guard Gen 0.6B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.01, + "output": 0.01, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.08, + "output": 0.55, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen2.5-Coder-32B-Instruct": { + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.11, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "Qwen/Qwen2.5-72B-Instruct": { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen2.5 72B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.13, + "output": 0.52, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "Qwen/Qwen2.5-VL-72B-Instruct-TEE": { + "id": "Qwen/Qwen2.5-VL-72B-Instruct-TEE", + "name": "Qwen2.5 VL 72B Instruct TEE", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.15, + "output": 0.6, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen3-235B-A22B": { + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen3 235B A22B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen2.5-VL-72B-Instruct": { + "id": "Qwen/Qwen2.5-VL-72B-Instruct", + "name": "Qwen2.5 VL 72B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.07, + "output": 0.26, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 32768, "output": 32768 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", + "name": "Qwen3 235B A22B Instruct 2507 TEE", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.08, + "output": 0.55, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 65536 } + }, + "Qwen/Qwen3-32B": { + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.08, + "output": 0.24, + "reasoning": 0.36, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 40960, "output": 40960 } + }, + "Qwen/Qwen3-VL-235B-A22B-Instruct": { + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-VL-235B-A22B-Thinking": { + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-30B-A3B-Instruct-2507": { + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.08, + "output": 0.33, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE", + "name": "Qwen3 Coder 480B A35B Instruct FP8 TEE", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.22, + "output": 0.95, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.11, + "output": 0.6, + "reasoning": 0.8999999999999999, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.8, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "zai-org/GLM-4.6-TEE": { + "id": "zai-org/GLM-4.6-TEE", + "name": "GLM 4.6 TEE", + "family": "zai-org", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.4, + "output": 1.75, + "reasoning": 2.625, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 202752, "output": 65536 } + }, + "zai-org/GLM-4.5-TEE": { + "id": "zai-org/GLM-4.5-TEE", + "name": "GLM 4.5 TEE", + "family": "zai-org", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.35, + "output": 1.55, + "reasoning": 2.325, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 65536 } + }, + "zai-org/GLM-4.6V": { + "id": "zai-org/GLM-4.6V", + "name": "GLM 4.6V", + "family": "zai-org", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 0.9, + "reasoning": 1.35, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 65536 } + }, + "zai-org/GLM-4.7-TEE": { + "id": "zai-org/GLM-4.7-TEE", + "name": "GLM 4.7 TEE", + "family": "zai-org", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.4, + "output": 1.5, + "reasoning": 2.25, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 202752, "output": 65535 } + }, + "zai-org/GLM-4.5-Air": { + "id": "zai-org/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "family": "zai-org", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.05, + "output": 0.22, + "reasoning": 0.33, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "deepseek-ai/DeepSeek-V3-0324-TEE": { + "id": "deepseek-ai/DeepSeek-V3-0324-TEE", + "name": "DeepSeek V3 0324 TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.24, + "output": 0.84, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek-ai/DeepSeek-V3.2-Speciale-TEE": { + "id": "deepseek-ai/DeepSeek-V3.2-Speciale-TEE", + "name": "DeepSeek V3.2 Speciale TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": false, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.27, + "output": 0.41, + "reasoning": 0.615, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek-ai/DeepSeek-V3.1-Terminus-TEE": { + "id": "deepseek-ai/DeepSeek-V3.1-Terminus-TEE", + "name": "DeepSeek V3.1 Terminus TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.23, + "output": 0.9, + "reasoning": 1.35, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek-ai/DeepSeek-V3": { + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek V3", + "family": "deepseek-ai", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek-ai/DeepSeek-R1-TEE": { + "id": "deepseek-ai/DeepSeek-R1-TEE", + "name": "DeepSeek R1 TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": false, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.3, + "output": 1.2, + "reasoning": 1.7999999999999998, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Llama-70B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.03, + "output": 0.11, + "reasoning": 0.165, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 131072, "output": 131072 } + }, + "deepseek-ai/DeepSeek-V3.1": { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.2, + "output": 0.8, + "reasoning": 1.2000000000000002, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek-ai/DeepSeek-R1-0528-TEE": { + "id": "deepseek-ai/DeepSeek-R1-0528-TEE", + "name": "DeepSeek R1 0528 TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.4, + "output": 1.75, + "reasoning": 2.625, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek-ai/DeepSeek-V3.2-TEE": { + "id": "deepseek-ai/DeepSeek-V3.2-TEE", + "name": "DeepSeek V3.2 TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.27, + "output": 0.41, + "reasoning": 0.615, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 16384 } + }, + "deepseek-ai/DeepSeek-V3.1-TEE": { + "id": "deepseek-ai/DeepSeek-V3.1-TEE", + "name": "DeepSeek V3.1 TEE", + "family": "deepseek-ai", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-29", + "last_updated": "2025-12-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { + "input": 0.2, + "output": 0.8, + "reasoning": 1.2000000000000002, + "cache_read": 0, + "cache_write": 0, + "input_audio": 0, + "output_audio": 0 + }, + "limit": { "context": 163840, "output": 65536 } + } + } + }, + "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/coding/docs/en/third-party-agents.html", + "models": { + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-11", + "last_updated": "2025-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 262144, "output": 32768 } + } + } + }, + "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": { + "nova-pro-v1": { + "id": "nova-pro-v1", + "name": "Nova Pro 1.0", + "family": "nova-pro", + "attachment": false, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 1.016, "output": 4.061 }, + "limit": { "context": 300000, "output": 5000 } + }, + "devstral-2512": { + "id": "devstral-2512", + "name": "Devstral 2 2512", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262000, "output": 262000 } + }, + "intellect-3": { + "id": "intellect-3", + "name": "INTELLECT 3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-26", + "last_updated": "2025-11-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.219, "output": 1.202 }, + "limit": { "context": 128000, "output": 128000 } + }, + "claude-4-5-sonnet": { + "id": "claude-4-5-sonnet", + "name": "Claude 4.5 Sonnet", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3.259, "output": 16.296 }, + "limit": { "context": 200000, "output": 200000 } + }, + "deepseek-v3-0324": { + "id": "deepseek-v3-0324", + "name": "DeepSeek V3 0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.551, "output": 1.654 }, + "limit": { "context": 128000, "output": 128000 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.656, "output": 2.731 }, + "limit": { "context": 262000, "output": 262000 } + }, + "kimi-k2-instruct": { + "id": "kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-07-11", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.551, "output": 2.646 }, + "limit": { "context": 131000, "output": 131000 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT 4.1", + "family": "gpt-4.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.354, "output": 9.417 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-20", + "last_updated": "2025-06-17", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.654, "output": 11.024 }, + "limit": { "context": 1048576, "output": 65535 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "GPT Oss 120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "devstral-small-2512": { + "id": "devstral-small-2512", + "name": "Devstral Small 2 2512", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262000, "output": 262000 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.441, "output": 1.984 }, + "limit": { "context": 262000, "output": 262000 } + }, + "claude-sonnet-4": { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3.307, "output": 16.536 }, + "limit": { "context": 200000, "output": 64000 } + }, + "llama-3.1-405b-instruct": { + "id": "llama-3.1-405b-instruct", + "name": "Llama 3.1 405B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "qwen3-next-80b-a3b-thinking": { + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.164, "output": 1.311 }, + "limit": { "context": 128000, "output": 128000 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.099, "output": 0.33 }, + "limit": { "context": 16384, "output": 16384 } + } + } + }, + "github-models": { + "id": "github-models", + "env": ["GITHUB_TOKEN"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://models.github.ai/inference", + "name": "GitHub Models", + "doc": "https://docs.github.com/en/github-models", + "models": { + "core42/jais-30b-chat": { + "id": "core42/jais-30b-chat", + "name": "JAIS 30b Chat", + "family": "jais", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-03", + "release_date": "2023-08-30", + "last_updated": "2023-08-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 2048 } + }, + "xai/grok-3": { + "id": "xai/grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12-09", + "last_updated": "2024-12-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "xai/grok-3-mini": { + "id": "xai/grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12-09", + "last_updated": "2024-12-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "cohere/cohere-command-r-08-2024": { + "id": "cohere/cohere-command-r-08-2024", + "name": "Cohere Command R 08-2024", + "family": "command-r", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-08-01", + "last_updated": "2024-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere/cohere-command-a": { + "id": "cohere/cohere-command-a", + "name": "Cohere Command A", + "family": "command-a", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere/cohere-command-r-plus-08-2024": { + "id": "cohere/cohere-command-r-plus-08-2024", + "name": "Cohere Command R+ 08-2024", + "family": "command-r-plus", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-08-01", + "last_updated": "2024-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere/cohere-command-r": { + "id": "cohere/cohere-command-r", + "name": "Cohere Command R", + "family": "command-r", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-03-11", + "last_updated": "2024-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere/cohere-command-r-plus": { + "id": "cohere/cohere-command-r-plus", + "name": "Cohere Command R+", + "family": "command-r-plus", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-04-04", + "last_updated": "2024-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "deepseek/deepseek-r1-0528": { + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek-R1-0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 65536, "output": 8192 } + }, + "deepseek/deepseek-r1": { + "id": "deepseek/deepseek-r1", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 65536, "output": 8192 } + }, + "deepseek/deepseek-v3-0324": { + "id": "deepseek/deepseek-v3-0324", + "name": "DeepSeek-V3-0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "mistral-ai/mistral-medium-2505": { + "id": "mistral-ai/mistral-medium-2505", + "name": "Mistral Medium 3 (25.05)", + "family": "mistral-medium", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-09", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "mistral-ai/ministral-3b": { + "id": "mistral-ai/ministral-3b", + "name": "Ministral 3B", + "family": "ministral-3b", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "mistral-ai/mistral-nemo": { + "id": "mistral-ai/mistral-nemo", + "name": "Mistral Nemo", + "family": "mistral-nemo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "mistral-ai/mistral-large-2411": { + "id": "mistral-ai/mistral-large-2411", + "name": "Mistral Large 24.11", + "family": "mistral-large", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-09", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "mistral-ai/codestral-2501": { + "id": "mistral-ai/codestral-2501", + "name": "Codestral 25.01", + "family": "codestral", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32000, "output": 8192 } + }, + "mistral-ai/mistral-small-2503": { + "id": "mistral-ai/mistral-small-2503", + "name": "Mistral Small 3.1", + "family": "mistral-small", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "microsoft/phi-3-medium-128k-instruct": { + "id": "microsoft/phi-3-medium-128k-instruct", + "name": "Phi-3-medium instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-mini-4k-instruct": { + "id": "microsoft/phi-3-mini-4k-instruct", + "name": "Phi-3-mini instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 1024 } + }, + "microsoft/phi-3-small-128k-instruct": { + "id": "microsoft/phi-3-small-128k-instruct", + "name": "Phi-3-small instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3.5-vision-instruct": { + "id": "microsoft/phi-3.5-vision-instruct", + "name": "Phi-3.5-vision instruct (128k)", + "family": "phi-3.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-4": { + "id": "microsoft/phi-4", + "name": "Phi-4", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 16000, "output": 4096 } + }, + "microsoft/phi-4-mini-reasoning": { + "id": "microsoft/phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-small-8k-instruct": { + "id": "microsoft/phi-3-small-8k-instruct", + "name": "Phi-3-small instruct (8k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 2048 } + }, + "microsoft/phi-3.5-mini-instruct": { + "id": "microsoft/phi-3.5-mini-instruct", + "name": "Phi-3.5-mini instruct (128k)", + "family": "phi-3.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-4-multimodal-instruct": { + "id": "microsoft/phi-4-multimodal-instruct", + "name": "Phi-4-multimodal-instruct", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-mini-128k-instruct": { + "id": "microsoft/phi-3-mini-128k-instruct", + "name": "Phi-3-mini instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3.5-moe-instruct": { + "id": "microsoft/phi-3.5-moe-instruct", + "name": "Phi-3.5-MoE instruct (128k)", + "family": "phi-3.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-4-mini-instruct": { + "id": "microsoft/phi-4-mini-instruct", + "name": "Phi-4-mini-instruct", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/phi-3-medium-4k-instruct": { + "id": "microsoft/phi-3-medium-4k-instruct", + "name": "Phi-3-medium instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 1024 } + }, + "microsoft/phi-4-reasoning": { + "id": "microsoft/phi-4-reasoning", + "name": "Phi-4-Reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "microsoft/mai-ds-r1": { + "id": "microsoft/mai-ds-r1", + "name": "MAI-DS-R1", + "family": "mai-ds-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 65536, "output": 8192 } + }, + "openai/gpt-4.1-nano": { + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1-nano", + "family": "gpt-4.1-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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-4.1-mini": { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1-mini", + "family": "gpt-4.1-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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o1-preview": { + "id": "openai/o1-preview", + "name": "OpenAI o1-preview", + "family": "o1-preview", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2023-10", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "openai/o3-mini": { + "id": "openai/o3-mini", + "name": "OpenAI o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-04", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4o": { + "id": "openai/gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "OpenAI o4-mini", + "family": "o4-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-04", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o1": { + "id": "openai/o1", + "name": "OpenAI o1", + "family": "o1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2023-10", + "release_date": "2024-09-12", + "last_updated": "2024-12-17", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o1-mini": { + "id": "openai/o1-mini", + "name": "OpenAI o1-mini", + "family": "o1-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2023-10", + "release_date": "2024-09-12", + "last_updated": "2024-12-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 65536 } + }, + "openai/o3": { + "id": "openai/o3", + "name": "OpenAI o3", + "family": "o3", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-04", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "meta/llama-3.2-11b-vision-instruct": { + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama-3.2-11B-Vision-Instruct", + "family": "llama-3.2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/meta-llama-3.1-405b-instruct": { + "id": "meta/meta-llama-3.1-405b-instruct", + "name": "Meta-Llama-3.1-405B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta/llama-4-maverick-17b-128e-instruct-fp8": { + "id": "meta/llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama-4-maverick", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/meta-llama-3-70b-instruct": { + "id": "meta/meta-llama-3-70b-instruct", + "name": "Meta-Llama-3-70B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 2048 } + }, + "meta/meta-llama-3.1-70b-instruct": { + "id": "meta/meta-llama-3.1-70b-instruct", + "name": "Meta-Llama-3.1-70B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta/llama-3.3-70b-instruct": { + "id": "meta/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta/llama-3.2-90b-vision-instruct": { + "id": "meta/llama-3.2-90b-vision-instruct", + "name": "Llama-3.2-90B-Vision-Instruct", + "family": "llama-3.2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/meta-llama-3-8b-instruct": { + "id": "meta/meta-llama-3-8b-instruct", + "name": "Meta-Llama-3-8B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 2048 } + }, + "meta/llama-4-scout-17b-16e-instruct": { + "id": "meta/llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "family": "llama-4-scout", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/meta-llama-3.1-8b-instruct": { + "id": "meta/meta-llama-3.1-8b-instruct", + "name": "Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "ai21-labs/ai21-jamba-1.5-large": { + "id": "ai21-labs/ai21-jamba-1.5-large", + "name": "AI21 Jamba 1.5 Large", + "family": "jamba-1.5-large", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-08-29", + "last_updated": "2024-08-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 4096 } + }, + "ai21-labs/ai21-jamba-1.5-mini": { + "id": "ai21-labs/ai21-jamba-1.5-mini", + "name": "AI21 Jamba 1.5 Mini", + "family": "jamba-1.5-mini", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-03", + "release_date": "2024-08-29", + "last_updated": "2024-08-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 4096 } + } + } + }, + "togetherai": { + "id": "togetherai", + "env": ["TOGETHER_API_KEY"], + "npm": "@ai-sdk/togetherai", + "name": "Together AI", + "doc": "https://docs.together.ai/docs/serverless-models", + "models": { + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "Kimi K2 Instruct", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 32768 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.2, "output": 4 }, + "limit": { "context": 262144, "output": 32768 } + }, + "essentialai/Rnj-1-Instruct": { + "id": "essentialai/Rnj-1-Instruct", + "name": "Rnj-1 Instruct", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 32768, "output": 32768 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 131072 } + }, + "meta-llama/Llama-3.3-70B-Instruct-Turbo": { + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B", + "family": "llama-3.3", + "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, + "cost": { "input": 0.88, "output": 0.88 }, + "limit": { "context": 131072, "output": 66536 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 2, "output": 2 }, + "limit": { "context": 262144, "output": 66536 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 200000, "output": 32768 } + }, + "deepseek-ai/DeepSeek-R1": { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3, "output": 7 }, + "limit": { "context": 163839, "output": 12288 } + }, + "deepseek-ai/DeepSeek-V3": { + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek V3", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 1.25 }, + "limit": { "context": 131072, "output": 12288 } + }, + "deepseek-ai/DeepSeek-V3-1": { + "id": "deepseek-ai/DeepSeek-V3-1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 1.7 }, + "limit": { "context": 131072, "output": 12288 } + } + } + }, + "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-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "family": "gpt-4.1-nano", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "text-embedding-3-small": { + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "family": "text-embedding-3-small", + "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, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8191, "output": 1536 } + }, + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "deepseek-r1-0528": { + "id": "deepseek-r1-0528", + "name": "DeepSeek-R1-0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 163840, "output": 163840 } + }, + "grok-4-fast-reasoning": { + "id": "grok-4-fast-reasoning", + "name": "Grok 4 Fast (Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "phi-3-medium-128k-instruct": { + "id": "phi-3-medium-128k-instruct", + "name": "Phi-3-medium-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.17, "output": 0.68 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-4": { + "id": "gpt-4", + "name": "GPT-4", + "family": "gpt-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-11", + "release_date": "2023-03-14", + "last_updated": "2023-03-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 60, "output": 120 }, + "limit": { "context": 8192, "output": 8192 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gpt-5.2-chat": { + "id": "gpt-5.2-chat", + "name": "GPT-5.2 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 128000, "output": 16384 } + }, + "llama-3.2-11b-vision-instruct": { + "id": "llama-3.2-11b-vision-instruct", + "name": "Llama-3.2-11B-Vision-Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.37, "output": 0.37 }, + "limit": { "context": 128000, "output": 8192 } + }, + "cohere-embed-v-4-0": { + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "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, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 128000, "output": 1536 } + }, + "cohere-command-r-08-2024": { + "id": "cohere-command-r-08-2024", + "name": "Command R", + "family": "command-r", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4000 } + }, + "grok-4": { + "id": "grok-4", + "name": "Grok 4", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "reasoning": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 64000 } + }, + "cohere-embed-v3-multilingual": { + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 512, "output": 1024 } + }, + "phi-4-mini": { + "id": "phi-4-mini", + "name": "Phi-4-mini", + "family": "phi-4", + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-4-32k": { + "id": "gpt-4-32k", + "name": "GPT-4 32K", + "family": "gpt-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-11", + "release_date": "2023-03-14", + "last_updated": "2023-03-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 60, "output": 120 }, + "limit": { "context": 32768, "output": 32768 } + }, + "meta-llama-3.1-405b-instruct": { + "id": "meta-llama-3.1-405b-instruct", + "name": "Meta-Llama-3.1-405B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 5.33, "output": 16 }, + "limit": { "context": 128000, "output": 32768 } + }, + "deepseek-r1": { + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 163840, "output": 163840 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "phi-3-mini-4k-instruct": { + "id": "phi-3-mini-4k-instruct", + "name": "Phi-3-mini-instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 4096, "output": 1024 } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-02-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "deepseek-v3.2-speciale": { + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 0.42 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistral-medium-2505": { + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 128000, "output": 128000 } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "phi-3-small-128k-instruct": { + "id": "phi-3-small-128k-instruct", + "name": "Phi-3-small-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere-command-a": { + "id": "cohere-command-a", + "name": "Command A", + "family": "command-a", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 256000, "output": 8000 } + }, + "cohere-command-r-plus-08-2024": { + "id": "cohere-command-r-plus-08-2024", + "name": "Command R+", + "family": "command-r-plus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 4000 } + }, + "llama-4-maverick-17b-128e-instruct-fp8": { + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "family": "gpt-4.1-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "gpt-5-chat": { + "id": "gpt-5-chat", + "name": "GPT-5 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-10-24", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 128000, "output": 16384 } + }, + "deepseek-v3.1": { + "id": "deepseek-v3.1", + "name": "DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.56, "output": 1.68 }, + "limit": { "context": 131072, "output": 131072 } + }, + "phi-4": { + "id": "phi-4", + "name": "Phi-4", + "family": "phi-4", + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "phi-4-mini-reasoning": { + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 128000, "output": 4096 } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gpt-3.5-turbo-0125": { + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 16384, "output": 16384 } + }, + "grok-3": { + "id": "grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "text-embedding-3-large": { + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "family": "text-embedding-3-large", + "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, + "cost": { "input": 0.13, "output": 0 }, + "limit": { "context": 8191, "output": 3072 } + }, + "meta-llama-3-70b-instruct": { + "id": "meta-llama-3-70b-instruct", + "name": "Meta-Llama-3-70B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2.68, "output": 3.54 }, + "limit": { "context": 8192, "output": 2048 } + }, + "deepseek-v3-0324": { + "id": "deepseek-v3-0324", + "name": "DeepSeek-V3-0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.14, "output": 4.56 }, + "limit": { "context": 131072, "output": 131072 } + }, + "phi-3-small-8k-instruct": { + "id": "phi-3-small-8k-instruct", + "name": "Phi-3-small-instruct (8k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 8192, "output": 2048 } + }, + "meta-llama-3.1-70b-instruct": { + "id": "meta-llama-3.1-70b-instruct", + "name": "Meta-Llama-3.1-70B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 2.68, "output": 3.54 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-4-turbo": { + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-3.5-turbo-0613": { + "id": "gpt-3.5-turbo-0613", + "name": "GPT-3.5 Turbo 0613", + "family": "gpt-3.5-turbo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-08", + "release_date": "2023-06-13", + "last_updated": "2023-06-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 4 }, + "limit": { "context": 16384, "output": 16384 } + }, + "phi-3.5-mini-instruct": { + "id": "phi-3.5-mini-instruct", + "name": "Phi-3.5-mini-instruct", + "family": "phi-3.5", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 128000, "output": 4096 } + }, + "o1-preview": { + "id": "o1-preview", + "name": "o1-preview", + "family": "o1-preview", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 16.5, "output": 66, "cache_read": 8.25 }, + "limit": { "context": 128000, "output": 32768 } + }, + "llama-3.3-70b-instruct": { + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0.71, "output": 0.71 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "family": "gpt-5-codex-mini", + "attachment": false, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "output": 128000 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "model-router": { + "id": "model-router", + "name": "Model Router", + "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, + "cost": { "input": 0.14, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 272000, "output": 128000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 272000, "output": 128000 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "llama-3.2-90b-vision-instruct": { + "id": "llama-3.2-90b-vision-instruct", + "name": "Llama-3.2-90B-Vision-Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 2.04, "output": 2.04 }, + "limit": { "context": 128000, "output": 8192 } + }, + "phi-3-mini-128k-instruct": { + "id": "phi-3-mini-128k-instruct", + "name": "Phi-3-mini-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-3.5-turbo-0301": { + "id": "gpt-3.5-turbo-0301", + "name": "GPT-3.5 Turbo 0301", + "family": "gpt-3.5-turbo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-08", + "release_date": "2023-03-01", + "last_updated": "2023-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 4096, "output": 4096 } + }, + "ministral-3b": { + "id": "ministral-3b", + "name": "Ministral 3B", + "family": "ministral-3b", + "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, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "phi-4-multimodal": { + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "family": "phi-4", + "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, + "cost": { "input": 0.08, "output": 0.32, "input_audio": 4 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama-3-8b-instruct": { + "id": "meta-llama-3-8b-instruct", + "name": "Meta-Llama-3-8B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.61 }, + "limit": { "context": 8192, "output": 2048 } + }, + "o1": { + "id": "o1", + "name": "o1", + "family": "o1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "grok-3-mini": { + "id": "grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "gpt-5.1-chat": { + "id": "gpt-5.1-chat", + "name": "GPT-5.1 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 128000, "output": 16384 } + }, + "phi-3.5-moe-instruct": { + "id": "phi-3.5-moe-instruct", + "name": "Phi-3.5-MoE-instruct", + "family": "phi-3.5", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.16, "output": 0.64 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 272000, "output": 128000 } + }, + "o1-mini": { + "id": "o1-mini", + "name": "o1-mini", + "family": "o1-mini", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 128000, "output": 65536 } + }, + "llama-4-scout-17b-16e-instruct": { + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "family": "llama-4-scout", + "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, + "cost": { "input": 0.2, "output": 0.78 }, + "limit": { "context": 128000, "output": 8192 } + }, + "cohere-embed-v3-english": { + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 512, "output": 1024 } + }, + "text-embedding-ada-002": { + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "family": "text-embedding-ada", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "meta-llama-3.1-8b-instruct": { + "id": "meta-llama-3.1-8b-instruct", + "name": "Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.3, "output": 0.61 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "family": "gpt-5-codex-max", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-3.5-turbo-instruct": { + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 4096, "output": 4096 } + }, + "mistral-nemo": { + "id": "mistral-nemo", + "name": "Mistral Nemo", + "family": "mistral-nemo", + "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"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 128000 } + }, + "o3": { + "id": "o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "codex-mini": { + "id": "codex-mini", + "name": "Codex Mini", + "family": "codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.375 }, + "limit": { "context": 200000, "output": 100000 } + }, + "phi-3-medium-4k-instruct": { + "id": "phi-3-medium-4k-instruct", + "name": "Phi-3-medium-instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.17, "output": 0.68 }, + "limit": { "context": 4096, "output": 1024 } + }, + "phi-4-reasoning": { + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 32000, "output": 4096 } + }, + "gpt-4-turbo-vision": { + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "phi-4-reasoning-plus": { + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 32000, "output": 4096 } + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 272000, "output": 128000 } + }, + "mai-ds-r1": { + "id": "mai-ds-r1", + "name": "MAI-DS-R1", + "family": "mai-ds-r1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "mistral-large-2411": { + "id": "mistral-large-2411", + "name": "Mistral Large 24.11", + "family": "mistral-large", + "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"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "codestral-2501": { + "id": "codestral-2501", + "name": "Codestral 25.01", + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 256000, "output": 256000 } + }, + "mistral-small-2503": { + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-3.5-turbo-1106": { + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 16384, "output": 16384 } + } + } + }, + "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/development/model-apis/overview", + "models": { + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct 0905", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.38, "output": 1.53 }, + "limit": { "context": 262144, "output": 66536 } + }, + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 204800, "output": 131072 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-08-31", + "release_date": "2025-09-16", + "last_updated": "2025-09-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 200000, "output": 200000 } + }, + "deepseek-ai/DeepSeek-V3.2": { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-10", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.45 }, + "limit": { "context": 163800, "output": 131100 } + } + } + }, + "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": { + "inclusionAI/Ling-mini-2.0": { + "id": "inclusionAI/Ling-mini-2.0", + "name": "inclusionAI/Ling-mini-2.0", + "family": "inclusionai-ling-mini", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-10", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 131000, "output": 131000 } + }, + "inclusionAI/Ling-flash-2.0": { + "id": "inclusionAI/Ling-flash-2.0", + "name": "inclusionAI/Ling-flash-2.0", + "family": "inclusionai-ling-flash", + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "inclusionAI/Ring-flash-2.0": { + "id": "inclusionAI/Ring-flash-2.0", + "name": "inclusionAI/Ring-flash-2.0", + "family": "inclusionai-ring-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "moonshotai/Kimi-K2-Instruct", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.58, "output": 2.29 }, + "limit": { "context": 131000, "output": 131000 } + }, + "moonshotai/Kimi-Dev-72B": { + "id": "moonshotai/Kimi-Dev-72B", + "name": "moonshotai/Kimi-Dev-72B", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-19", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 1.15 }, + "limit": { "context": 131000, "output": 131000 } + }, + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-08", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262000, "output": 262000 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "moonshotai/Kimi-K2-Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-07", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.55, "output": 2.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "tencent/Hunyuan-MT-7B": { + "id": "tencent/Hunyuan-MT-7B", + "name": "tencent/Hunyuan-MT-7B", + "family": "hunyuan", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 33000, "output": 33000 } + }, + "tencent/Hunyuan-A13B-Instruct": { + "id": "tencent/Hunyuan-A13B-Instruct", + "name": "tencent/Hunyuan-A13B-Instruct", + "family": "hunyuan", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "MiniMaxAI/MiniMax-M2": { + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMaxAI/MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 197000, "output": 131000 } + }, + "MiniMaxAI/MiniMax-M1-80k": { + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMaxAI/MiniMax-M1-80k", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-17", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.55, "output": 2.2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "THUDM/GLM-4-32B-0414": { + "id": "THUDM/GLM-4-32B-0414", + "name": "THUDM/GLM-4-32B-0414", + "family": "glm-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.27 }, + "limit": { "context": 33000, "output": 33000 } + }, + "THUDM/GLM-4.1V-9B-Thinking": { + "id": "THUDM/GLM-4.1V-9B-Thinking", + "name": "THUDM/GLM-4.1V-9B-Thinking", + "family": "glm-4v", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.035, "output": 0.14 }, + "limit": { "context": 66000, "output": 66000 } + }, + "THUDM/GLM-Z1-9B-0414": { + "id": "THUDM/GLM-Z1-9B-0414", + "name": "THUDM/GLM-Z1-9B-0414", + "family": "glm-z1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.086, "output": 0.086 }, + "limit": { "context": 131000, "output": 131000 } + }, + "THUDM/GLM-4-9B-0414": { + "id": "THUDM/GLM-4-9B-0414", + "name": "THUDM/GLM-4-9B-0414", + "family": "glm-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.086, "output": 0.086 }, + "limit": { "context": 33000, "output": 33000 } + }, + "THUDM/GLM-Z1-32B-0414": { + "id": "THUDM/GLM-Z1-32B-0414", + "name": "THUDM/GLM-Z1-32B-0414", + "family": "glm-z1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-18", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "openai/gpt-oss-20b", + "family": "openai-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, + "cost": { "input": 0.04, "output": 0.18 }, + "limit": { "context": 131000, "output": 8000 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "openai/gpt-oss-120b", + "family": "openai-gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.45 }, + "limit": { "context": 131000, "output": 8000 } + }, + "stepfun-ai/step3": { + "id": "stepfun-ai/step3", + "name": "stepfun-ai/step3", + "family": "stepfun-ai-step3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-06", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.57, "output": 1.42 }, + "limit": { "context": 66000, "output": 66000 } + }, + "nex-agi/DeepSeek-V3.1-Nex-N1": { + "id": "nex-agi/DeepSeek-V3.1-Nex-N1", + "name": "nex-agi/DeepSeek-V3.1-Nex-N1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-01", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "baidu/ERNIE-4.5-300B-A47B": { + "id": "baidu/ERNIE-4.5-300B-A47B", + "name": "baidu/ERNIE-4.5-300B-A47B", + "family": "ernie-4", + "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, + "cost": { "input": 0.28, "output": 1.1 }, + "limit": { "context": 131000, "output": 131000 } + }, + "z-ai/GLM-4.5": { + "id": "z-ai/GLM-4.5", + "name": "z-ai/GLM-4.5", + "family": "glm-4.5", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "z-ai/GLM-4.5-Air": { + "id": "z-ai/GLM-4.5-Air", + "name": "z-ai/GLM-4.5-Air", + "family": "glm-4.5-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, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 131000, "output": 131000 } + }, + "ByteDance-Seed/Seed-OSS-36B-Instruct": { + "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "family": "bytedance-seed-seed-oss", + "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, + "cost": { "input": 0.21, "output": 0.57 }, + "limit": { "context": 262000, "output": 262000 } + }, + "meta-llama/Meta-Llama-3.1-8B-Instruct": { + "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "name": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-23", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.06, "output": 0.06 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-30B-A3B": { + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen/Qwen3-30B-A3B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.09, "output": 0.45 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-30B-A3B-Thinking-2507": { + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.09, "output": 0.3 }, + "limit": { "context": 262000, "output": 131000 } + }, + "Qwen/Qwen3-VL-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.29, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-14B": { + "id": "Qwen/Qwen3-14B", + "name": "Qwen/Qwen3-14B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-VL-32B-Instruct": { + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen/Qwen2.5-VL-32B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-24", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.27 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Captioner": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "family": "qwen3-omni", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen3-8B": { + "id": "Qwen/Qwen3-8B", + "name": "Qwen/Qwen3-8B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.06, "output": 0.06 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "family": "qwen3-omni", + "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", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen3-VL-8B-Thinking": { + "id": "Qwen/Qwen3-VL-8B-Thinking", + "name": "Qwen/Qwen3-VL-8B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.18, "output": 2 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-23", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.09, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen2.5-Coder-32B-Instruct": { + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen/Qwen2.5-Coder-32B-Instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-11-11", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen2.5-32B-Instruct": { + "id": "Qwen/Qwen2.5-32B-Instruct", + "name": "Qwen/Qwen2.5-32B-Instruct", + "family": "qwen2.5", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-09-19", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen2.5-72B-Instruct-128K": { + "id": "Qwen/Qwen2.5-72B-Instruct-128K", + "name": "Qwen/Qwen2.5-72B-Instruct-128K", + "family": "qwen2.5", + "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, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 131000, "output": 4000 } + }, + "Qwen/Qwen2.5-72B-Instruct": { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen/Qwen2.5-72B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-Coder-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen2.5-7B-Instruct": { + "id": "Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen/Qwen2.5-7B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-235B-A22B": { + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen/Qwen3-235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.35, "output": 1.42 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-VL-72B-Instruct": { + "id": "Qwen/Qwen2.5-VL-72B-Instruct", + "name": "Qwen/Qwen2.5-VL-72B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.59, "output": 0.59 }, + "limit": { "context": 131000, "output": 4000 } + }, + "Qwen/QwQ-32B": { + "id": "Qwen/QwQ-32B", + "name": "Qwen/QwQ-32B", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-06", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.58 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen2.5-VL-7B-Instruct": { + "id": "Qwen/Qwen2.5-VL-7B-Instruct", + "name": "Qwen/Qwen2.5-VL-7B-Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-32B": { + "id": "Qwen/Qwen3-32B", + "name": "Qwen/Qwen3-32B", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 131000, "output": 131000 } + }, + "Qwen/Qwen3-VL-8B-Instruct": { + "id": "Qwen/Qwen3-VL-8B-Instruct", + "name": "Qwen/Qwen3-VL-8B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.18, "output": 0.68 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-235B-A22B-Instruct": { + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-235B-A22B-Thinking": { + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.45, "output": 3.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-30B-A3B-Instruct-2507": { + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "family": "qwen3", + "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, + "cost": { "input": 0.09, "output": 0.3 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-30B-A3B-Thinking": { + "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.29, "output": 1 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-VL-32B-Thinking": { + "id": "Qwen/Qwen3-VL-32B-Thinking", + "name": "Qwen/Qwen3-VL-32B-Thinking", + "family": "qwen3-vl", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.13, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Omni-30B-A3B-Thinking": { + "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "family": "qwen3-omni", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 66000, "output": 66000 } + }, + "Qwen/Qwen3-VL-32B-Instruct": { + "id": "Qwen/Qwen3-VL-32B-Instruct", + "name": "Qwen/Qwen3-VL-32B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Qwen/Qwen2.5-14B-Instruct": { + "id": "Qwen/Qwen2.5-14B-Instruct", + "name": "Qwen/Qwen2.5-14B-Instruct", + "family": "qwen2.5", + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 33000, "output": 4000 } + }, + "Qwen/Qwen3-Next-80B-A3B-Thinking": { + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-25", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.57 }, + "limit": { "context": 262000, "output": 262000 } + }, + "zai-org/GLM-4.5": { + "id": "zai-org/GLM-4.5", + "name": "zai-org/GLM-4.5", + "family": "glm-4.5", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131000, "output": 131000 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "zai-org/GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-04", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.9 }, + "limit": { "context": 205000, "output": 205000 } + }, + "zai-org/GLM-4.5V": { + "id": "zai-org/GLM-4.5V", + "name": "zai-org/GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 66000, "output": 66000 } + }, + "zai-org/GLM-4.5-Air": { + "id": "zai-org/GLM-4.5-Air", + "name": "zai-org/GLM-4.5-Air", + "family": "glm-4.5-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, + "cost": { "input": 0.14, "output": 0.86 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/DeepSeek-R1": { + "id": "deepseek-ai/DeepSeek-R1", + "name": "deepseek-ai/DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.5, "output": 2.18 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0.18 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/deepseek-vl2": { + "id": "deepseek-ai/deepseek-vl2", + "name": "deepseek-ai/deepseek-vl2", + "family": "deepseek", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-12-13", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 4000, "output": 4000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 131000, "output": 131000 } + }, + "deepseek-ai/DeepSeek-V3.2-Exp": { + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "deepseek-ai/DeepSeek-V3.2-Exp", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 0.41 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-V3.1-Terminus": { + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": { + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 33000, "output": 16000 } + }, + "deepseek-ai/DeepSeek-V3": { + "id": "deepseek-ai/DeepSeek-V3", + "name": "deepseek-ai/DeepSeek-V3", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "deepseek-ai/DeepSeek-V3.1": { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "deepseek-ai/DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + } + } + }, + "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-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "OpenAI GPT-4.1 Nano", + "family": "gpt-4.1-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, + "cost": { "input": 0.09999999999999999, "output": 0.39999999999999997, "cache_read": 0.024999999999999998 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "xAI Grok 4 Fast Non-Reasoning", + "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, + "cost": { "input": 0.19999999999999998, "output": 0.5, "cache_read": 0.049999999999999996 }, + "limit": { "context": 2000000, "output": 2000000 } + }, + "qwen3-coder": { + "id": "qwen3-coder", + "name": "Qwen3 Coder 480B A35B Instruct Turbo", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.22, "output": 0.95 }, + "limit": { "context": 262144, "output": 16384 } + }, + "deepseek-v3": { + "id": "deepseek-v3", + "name": "DeepSeek V3", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.56, "output": 1.68, "cache_read": 0.07 }, + "limit": { "context": 128000, "output": 8192 } + }, + "claude-opus-4": { + "id": "claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "family": "claude-opus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "grok-4-fast-reasoning": { + "id": "grok-4-fast-reasoning", + "name": "xAI: Grok 4 Fast Reasoning", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.19999999999999998, "output": 0.5, "cache_read": 0.049999999999999996 }, + "limit": { "context": 2000000, "output": 2000000 } + }, + "llama-3.1-8b-instant": { + "id": "llama-3.1-8b-instant", + "name": "Meta Llama 3.1 8B Instant", + "family": "llama-3.1", + "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, + "cost": { "input": 0.049999999999999996, "output": 0.08 }, + "limit": { "context": 131072, "output": 32678 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Anthropic: Claude Opus 4.1", + "family": "claude-opus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "grok-4": { + "id": "grok-4", + "name": "xAI Grok 4", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 256000 } + }, + "qwen3-next-80b-a3b-instruct": { + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262000, "output": 16384 } + }, + "llama-4-maverick": { + "id": "llama-4-maverick", + "name": "Meta Llama 4 Maverick 17B 128E", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 8192 } + }, + "llama-prompt-guard-2-86m": { + "id": "llama-prompt-guard-2-86m", + "name": "Meta Llama Prompt Guard 2 86M", + "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, + "cost": { "input": 0.01, "output": 0.01 }, + "limit": { "context": 512, "output": 2 } + }, + "grok-4-1-fast-reasoning": { + "id": "grok-4-1-fast-reasoning", + "name": "xAI Grok 4.1 Fast Reasoning", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.19999999999999998, "output": 0.5, "cache_read": 0.049999999999999996 }, + "limit": { "context": 2000000, "output": 2000000 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "xAI Grok Code Fast 1", + "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, + "cost": { "input": 0.19999999999999998, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "claude-4.5-haiku": { + "id": "claude-4.5-haiku", + "name": "Anthropic: Claude 4.5 Haiku", + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.09999999999999999, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 8192 } + }, + "llama-3.1-8b-instruct-turbo": { + "id": "llama-3.1-8b-instruct-turbo", + "name": "Meta Llama 3.1 8B Instruct Turbo", + "family": "llama-3.1", + "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, + "cost": { "input": 0.02, "output": 0.03 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "OpenAI: GPT-5.1 Codex", + "family": "gpt-5-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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4.1-mini-2025-04-14": { + "id": "gpt-4.1-mini-2025-04-14", + "name": "OpenAI GPT-4.1 Mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.39999999999999997, "output": 1.5999999999999999, "cache_read": 0.09999999999999999 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "llama-guard-4": { + "id": "llama-guard-4", + "name": "Meta Llama Guard 4 12B", + "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, + "cost": { "input": 0.21, "output": 0.21 }, + "limit": { "context": 131072, "output": 1024 } + }, + "llama-3.1-8b-instruct": { + "id": "llama-3.1-8b-instruct", + "name": "Meta Llama 3.1 8B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.02, "output": 0.049999999999999996 }, + "limit": { "context": 16384, "output": 16384 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Google Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 12, "cache_read": 0.19999999999999998 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Google Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.3 }, + "limit": { "context": 1048576, "output": 65535 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "OpenAI GPT-4.1 Mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.39999999999999997, "output": 1.5999999999999999, "cache_read": 0.09999999999999999 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "deepseek-v3.1-terminus": { + "id": "deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1, "cache_read": 0.21600000000000003 }, + "limit": { "context": 128000, "output": 16384 } + }, + "llama-prompt-guard-2-22m": { + "id": "llama-prompt-guard-2-22m", + "name": "Meta Llama Prompt Guard 2 22M", + "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, + "cost": { "input": 0.01, "output": 0.01 }, + "limit": { "context": 512, "output": 2 } + }, + "claude-3.5-sonnet-v2": { + "id": "claude-3.5-sonnet-v2", + "name": "Anthropic: Claude 3.5 Sonnet v2", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.30000000000000004, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "sonar-deep-research": { + "id": "sonar-deep-research", + "name": "Perplexity Sonar Deep Research", + "family": "sonar-deep-research", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 127000, "output": 4096 } + }, + "gemini-2.5-flash-lite": { + "id": "gemini-2.5-flash-lite", + "name": "Google Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": false, + "reasoning": true, + "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, + "cost": { + "input": 0.09999999999999999, + "output": 0.39999999999999997, + "cache_read": 0.024999999999999998, + "cache_write": 0.09999999999999999 + }, + "limit": { "context": 1048576, "output": 65535 } + }, + "claude-sonnet-4-5-20250929": { + "id": "claude-sonnet-4-5-20250929", + "name": "Anthropic: Claude Sonnet 4.5 (20250929)", + "family": "claude-sonnet", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.30000000000000004, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "grok-3": { + "id": "grok-3", + "name": "xAI Grok 3", + "family": "grok-3", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistral-small": { + "id": "mistral-small", + "name": "Mistral Small", + "family": "mistral-small", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-02", + "release_date": "2024-02-26", + "last_updated": "2024-02-26", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 75, "output": 200 }, + "limit": { "context": 128000, "output": 128000 } + }, + "kimi-k2-0711": { + "id": "kimi-k2-0711", + "name": "Kimi K2 (07/11)", + "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, + "cost": { "input": 0.5700000000000001, "output": 2.3 }, + "limit": { "context": 131072, "output": 16384 } + }, + "chatgpt-4o-latest": { + "id": "chatgpt-4o-latest", + "name": "OpenAI ChatGPT-4o", + "family": "chatgpt-4o", + "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, + "cost": { "input": 5, "output": 20, "cache_read": 2.5 }, + "limit": { "context": 128000, "output": 16384 } + }, + "qwen3-coder-30b-a3b-instruct": { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.09999999999999999, "output": 0.3 }, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-0905": { + "id": "kimi-k2-0905", + "name": "Kimi K2 (09/05)", + "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, + "cost": { "input": 0.5, "output": 2, "cache_read": 0.39999999999999997 }, + "limit": { "context": 262144, "output": 16384 } + }, + "sonar-reasoning": { + "id": "sonar-reasoning", + "name": "Perplexity Sonar Reasoning", + "family": "sonar-reasoning", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 127000, "output": 4096 } + }, + "llama-3.3-70b-instruct": { + "id": "llama-3.3-70b-instruct", + "name": "Meta Llama 3.3 70B Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0.13, "output": 0.39 }, + "limit": { "context": 128000, "output": 16400 } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1 Codex Mini", + "family": "gpt-5-codex-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", "image"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.024999999999999998 }, + "limit": { "context": 400000, "output": 128000 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "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, + "cost": { "input": 0.48, "output": 2 }, + "limit": { "context": 256000, "output": 262144 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "OpenAI o3 Mini", + "family": "o3-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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "claude-4.5-sonnet": { + "id": "claude-4.5-sonnet", + "name": "Anthropic: Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.30000000000000004, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "OpenAI GPT-5.1", + "family": "gpt-5", + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 400000, "output": 128000 } + }, + "codex-mini-latest": { + "id": "codex-mini-latest", + "name": "OpenAI Codex Mini Latest", + "family": "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"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.375 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "OpenAI GPT-5 Nano", + "family": "gpt-5-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, + "cost": { "input": 0.049999999999999996, "output": 0.39999999999999997, "cache_read": 0.005 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "family": "gpt-5-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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "OpenAI GPT-4o", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "deepseek-tng-r1t2-chimera": { + "id": "deepseek-tng-r1t2-chimera", + "name": "DeepSeek TNG R1T2 Chimera", + "family": "deepseek-r1", + "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, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 130000, "output": 163840 } + }, + "claude-4.5-opus": { + "id": "claude-4.5-opus", + "name": "Anthropic: Claude Opus 4.5", + "family": "claude-opus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5000000000000001, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "OpenAI GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "sonar": { + "id": "sonar", + "name": "Perplexity Sonar", + "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, + "cost": { "input": 1, "output": 1 }, + "limit": { "context": 127000, "output": 4096 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "Zai GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.44999999999999996, "output": 1.5 }, + "limit": { "context": 204800, "output": 131072 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "OpenAI o4 Mini", + "family": "o4-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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.275 }, + "limit": { "context": 200000, "output": 100000 } + }, + "qwen3-235b-a22b-thinking": { + "id": "qwen3-235b-a22b-thinking", + "name": "Qwen3 235B A22B Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.9000000000000004 }, + "limit": { "context": 262144, "output": 81920 } + }, + "hermes-2-pro-llama-3-8b": { + "id": "hermes-2-pro-llama-3-8b", + "name": "Hermes 2 Pro Llama 3 8B", + "family": "llama-3", + "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, + "cost": { "input": 0.14, "output": 0.14 }, + "limit": { "context": 131072, "output": 131072 } + }, + "o1": { + "id": "o1", + "name": "OpenAI: o1", + "family": "o1", + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "grok-3-mini": { + "id": "grok-3-mini", + "name": "xAI Grok 3 Mini", + "family": "grok-3", + "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, + "cost": { "input": 0.3, "output": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 131072 } + }, + "sonar-pro": { + "id": "sonar-pro", + "name": "Perplexity Sonar Pro", + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 4096 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "OpenAI GPT-5 Mini", + "family": "gpt-5-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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.024999999999999998 }, + "limit": { "context": 400000, "output": 128000 } + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.03, "output": 0.13 }, + "limit": { "context": 128000, "output": 4096 } + }, + "o1-mini": { + "id": "o1-mini", + "name": "OpenAI: o1-mini", + "family": "o1-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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 128000, "output": 65536 } + }, + "claude-3.7-sonnet": { + "id": "claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.30000000000000004, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-haiku-20240307": { + "id": "claude-3-haiku-20240307", + "name": "Anthropic: Claude 3 Haiku", + "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, + "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "o3-pro": { + "id": "o3-pro", + "name": "OpenAI o3 Pro", + "family": "o3-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, + "cost": { "input": 20, "output": 80 }, + "limit": { "context": 200000, "output": 100000 } + }, + "qwen2.5-coder-7b-fast": { + "id": "qwen2.5-coder-7b-fast", + "name": "Qwen2.5 Coder 7B fast", + "family": "qwen2.5-coder", + "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, + "cost": { "input": 0.03, "output": 0.09 }, + "limit": { "context": 32000, "output": 8192 } + }, + "deepseek-reasoner": { + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "family": "deepseek", + "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, + "cost": { "input": 0.56, "output": 1.68, "cache_read": 0.07 }, + "limit": { "context": 128000, "output": 64000 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Google Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.3125, "cache_write": 1.25 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemma-3-12b-it": { + "id": "gemma-3-12b-it", + "name": "Google Gemma 3 12B", + "family": "gemma-3", + "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, + "cost": { "input": 0.049999999999999996, "output": 0.09999999999999999 }, + "limit": { "context": 131072, "output": 8192 } + }, + "mistral-nemo": { + "id": "mistral-nemo", + "name": "Mistral Nemo", + "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, + "cost": { "input": 20, "output": 40 }, + "limit": { "context": 128000, "output": 16400 } + }, + "o3": { + "id": "o3", + "name": "OpenAI o3", + "family": "o3", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-oss-20b": { + "id": "gpt-oss-20b", + "name": "OpenAI GPT-OSS 20b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.049999999999999996, "output": 0.19999999999999998 }, + "limit": { "context": 131072, "output": 131072 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "OpenAI GPT-OSS 120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.04, "output": 0.16 }, + "limit": { "context": 131072, "output": 131072 } + }, + "claude-3.5-haiku": { + "id": "claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "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, + "cost": { "input": 0.7999999999999999, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "gpt-5-chat-latest": { + "id": "gpt-5-chat-latest", + "name": "OpenAI GPT-5 Chat Latest", + "family": "gpt-5-chat", + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "OpenAI GPT-4o-mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.075 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gemma2-9b-it": { + "id": "gemma2-9b-it", + "name": "Google Gemma 2", + "family": "gemma-2", + "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, + "cost": { "input": 0.01, "output": 0.03 }, + "limit": { "context": 8192, "output": 8192 } + }, + "claude-sonnet-4": { + "id": "claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.30000000000000004, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "sonar-reasoning-pro": { + "id": "sonar-reasoning-pro", + "name": "Perplexity Sonar Reasoning Pro", + "family": "sonar-reasoning", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 127000, "output": 4096 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "OpenAI GPT-5", + "family": "gpt-5", + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 400000, "output": 128000 } + }, + "qwen3-vl-235b-a22b-instruct": { + "id": "qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 256000, "output": 16384 } + }, + "qwen3-30b-a3b": { + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "family": "qwen3", + "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, + "cost": { "input": 0.08, "output": 0.29 }, + "limit": { "context": 41000, "output": 41000 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.27, "output": 0.41 }, + "limit": { "context": 163840, "output": 65536 } + }, + "grok-4-1-fast-non-reasoning": { + "id": "grok-4-1-fast-non-reasoning", + "name": "xAI Grok 4.1 Fast Non-Reasoning", + "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, + "cost": { "input": 0.19999999999999998, "output": 0.5, "cache_read": 0.049999999999999996 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "family": "gpt-5-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, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 128000, "output": 32768 } + }, + "llama-3.3-70b-versatile": { + "id": "llama-3.3-70b-versatile", + "name": "Meta Llama 3.3 70B Versatile", + "family": "llama-3.3", + "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, + "cost": { "input": 0.59, "output": 0.7899999999999999 }, + "limit": { "context": 131072, "output": 32678 } + }, + "mistral-large-2411": { + "id": "mistral-large-2411", + "name": "Mistral-Large", + "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, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 128000, "output": 32768 } + }, + "claude-opus-4-1-20250805": { + "id": "claude-opus-4-1-20250805", + "name": "Anthropic: Claude Opus 4.1 (20250805)", + "family": "claude-opus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "ernie-4.5-21b-a3b-thinking": { + "id": "ernie-4.5-21b-a3b-thinking", + "name": "Baidu Ernie 4.5 21B A3B Thinking", + "family": "ernie-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 128000, "output": 8000 } + }, + "gpt-5.1-chat-latest": { + "id": "gpt-5.1-chat-latest", + "name": "OpenAI GPT-5.1 Chat", + "family": "gpt-5-chat", + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.12500000000000003 }, + "limit": { "context": 128000, "output": 16384 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.29, "output": 0.59 }, + "limit": { "context": 131072, "output": 40960 } + }, + "claude-haiku-4-5-20251001": { + "id": "claude-haiku-4-5-20251001", + "name": "Anthropic: Claude 4.5 Haiku (20251001)", + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.09999999999999999, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 8192 } + }, + "llama-4-scout": { + "id": "llama-4-scout", + "name": "Meta Llama 4 Scout 17B 16E", + "family": "llama-4-scout", + "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, + "cost": { "input": 0.08, "output": 0.3 }, + "limit": { "context": 131072, "output": 8192 } + } + } + }, + "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": { + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "Kimi-K2-Instruct", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 16384 } + }, + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi-K2-Instruct-0905", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 262144, "output": 16384 } + }, + "MiniMaxAI/MiniMax-M2": { + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-10", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 204800, "output": 204800 } + }, + "Qwen/Qwen3-Embedding-8B": { + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen 3 Embedding 8B", + "family": "qwen3", + "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, + "cost": { "input": 0.01, "output": 0 }, + "limit": { "context": 32000, "output": 4096 } + }, + "Qwen/Qwen3-Embedding-4B": { + "id": "Qwen/Qwen3-Embedding-4B", + "name": "Qwen 3 Embedding 4B", + "family": "qwen3", + "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, + "cost": { "input": 0.01, "output": 0 }, + "limit": { "context": 32000, "output": 2048 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 2, "output": 2 }, + "limit": { "context": 262144, "output": 66536 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 3 }, + "limit": { "context": 262144, "output": 131072 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next-80B-A3B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 262144, "output": 66536 } + }, + "Qwen/Qwen3-Next-80B-A3B-Thinking": { + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen3-Next-80B-A3B-Thinking", + "family": "qwen3", + "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, + "cost": { "input": 0.3, "output": 2 }, + "limit": { "context": 262144, "output": 131072 } + }, + "zai-org/GLM-4.5": { + "id": "zai-org/GLM-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 131072, "output": 98304 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 200000, "output": 128000 } + }, + "zai-org/GLM-4.5-Air": { + "id": "zai-org/GLM-4.5-Air", + "name": "GLM-4.5-Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.1 }, + "limit": { "context": 128000, "output": 96000 } + }, + "deepseek-ai/Deepseek-V3-0324": { + "id": "deepseek-ai/Deepseek-V3-0324", + "name": "DeepSeek-V3-0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.25, "output": 1.25 }, + "limit": { "context": 16384, "output": 8192 } + }, + "deepseek-ai/DeepSeek-R1-0528": { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek-R1-0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 5 }, + "limit": { "context": 163840, "output": 163840 } + } + } + }, + "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": { + "qwen3-coder": { + "id": "qwen3-coder", + "name": "Qwen3 Coder", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.45, "output": 1.8 }, + "limit": { "context": 262144, "output": 65536 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "kimi-k2": { + "id": "kimi-k2", + "name": "Kimi K2", + "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, + "cost": { "input": 0.4, "output": 2.5, "cache_read": 0.4 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gemini-3-pro": { + "id": "gemini-3-pro", + "name": "Gemini 3 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 2, + "output": 12, + "cache_read": 0.2, + "context_over_200k": { "input": 4, "output": 18, "cache_read": 0.4 } + }, + "limit": { "context": 1048576, "output": 65536 }, + "provider": { "npm": "@ai-sdk/google" } + }, + "alpha-glm-4.7": { + "id": "alpha-glm-4.7", + "name": "Alpha GLM-4.7", + "family": "alpha-glm", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.6 }, + "limit": { "context": 204800, "output": 131072 }, + "status": "alpha" + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 3, + "output": 15, + "cache_read": 0.3, + "cache_write": 3.75, + "context_over_200k": { "input": 6, "output": 22.5, "cache_read": 0.6, "cache_write": 7.5 } + }, + "limit": { "context": 1000000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "family": "gpt-5-codex-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "alpha-gd4": { + "id": "alpha-gd4", + "name": "Alpha GD4", + "family": "alpha-gd4", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.5, "output": 2, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 32768 }, + "status": "alpha", + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.4, "output": 2.5, "cache_read": 0.4 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, + "limit": { "context": 400000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 400000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, + "limit": { "context": 400000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "big-pickle": { + "id": "big-pickle", + "name": "Big Pickle", + "family": "big-pickle", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-10-17", + "last_updated": "2025-10-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 128000 } + }, + "claude-3-5-haiku": { + "id": "claude-3-5-haiku", + "name": "Claude Haiku 3.5", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.1 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.7-free": { + "id": "glm-4.7-free", + "name": "GLM-4.7", + "family": "glm-free", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "grok-code": { + "id": "grok-code", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-20", + "last_updated": "2025-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 256000, "output": 256000 } + }, + "gemini-3-flash": { + "id": "gemini-3-flash", + "name": "Gemini 3 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.5, "output": 3, "cache_read": 0.05 }, + "limit": { "context": 1048576, "output": 65536 }, + "provider": { "npm": "@ai-sdk/google" } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "minimax-m2.1-free": { + "id": "minimax-m2.1-free", + "name": "MiniMax M2.1", + "family": "minimax-free", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 204800, "output": 131072 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "claude-sonnet-4": { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 3, + "output": 15, + "cache_read": 0.3, + "cache_write": 3.75, + "context_over_200k": { "input": 6, "output": 22.5, "cache_read": 0.6, "cache_write": 7.5 } + }, + "limit": { "context": 1000000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, + "limit": { "context": 400000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + } + } + }, + "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": { + "moonshotai/kimi-k2": { + "id": "moonshotai/kimi-k2", + "name": "Kimi K2", + "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, + "cost": { "input": 0.55, "output": 2.2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "x-ai/grok-4": { + "id": "x-ai/grok-4", + "name": "Grok 4", + "family": "grok-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.75, "cache_write": 15 }, + "limit": { "context": 256000, "output": 64000 } + }, + "google/gemini-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "openai/gpt-5-nano": { + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.005 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-5-mini": { + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.2 }, + "limit": { "context": 131072, "output": 65536 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "qwen/qwen3-coder": { + "id": "qwen/qwen3-coder", + "name": "Qwen3 Coder", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 262144, "output": 66536 } + }, + "anthropic/claude-opus-4.1": { + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "deepseek-ai/deepseek-r1-distill-llama-70b": { + "id": "deepseek-ai/deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.03, "output": 0.14 }, + "limit": { "context": 131072, "output": 131072 } + } + } + }, + "minimax": { + "id": "minimax", + "env": ["MINIMAX_API_KEY"], + "npm": "@ai-sdk/anthropic", + "api": "https://api.minimax.io/anthropic/v1", + "name": "MiniMax", + "doc": "https://platform.minimax.io/docs/guides/quickstart", + "models": { + "MiniMax-M2": { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 196608, "output": 128000 } + }, + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, + "google": { + "id": "google", + "env": ["GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"], + "npm": "@ai-sdk/google", + "name": "Google", + "doc": "https://ai.google.dev/gemini-api/docs/pricing", + "models": { + "gemini-embedding-001": { + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "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, + "cost": { "input": 0.15, "output": 0 }, + "limit": { "context": 2048, "output": 3072 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 0.5, + "output": 3, + "cache_read": 0.05, + "context_over_200k": { "input": 0.5, "output": 3, "cache_read": 0.05 } + }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-image": { + "id": "gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "family": "gemini-flash-image", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "modalities": { "input": ["text", "image"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 30, "cache_read": 0.075 }, + "limit": { "context": 32768, "output": 32768 } + }, + "gemini-2.5-flash-preview-05-20": { + "id": "gemini-2.5-flash-preview-05-20", + "name": "Gemini 2.5 Flash Preview 05-20", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-flash-lite-latest": { + "id": "gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 2, + "output": 12, + "cache_read": 0.2, + "context_over_200k": { "input": 4, "output": 18, "cache_read": 0.4 } + }, + "limit": { "context": 1000000, "output": 64000 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-flash-latest": { + "id": "gemini-flash-latest", + "name": "Gemini Flash Latest", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro-preview-05-06": { + "id": "gemini-2.5-pro-preview-05-06", + "name": "Gemini 2.5 Pro Preview 05-06", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-05-06", + "last_updated": "2025-05-06", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-preview-tts": { + "id": "gemini-2.5-flash-preview-tts", + "name": "Gemini 2.5 Flash Preview TTS", + "family": "gemini-flash-tts", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", + "modalities": { "input": ["text"], "output": ["audio"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 10 }, + "limit": { "context": 8000, "output": 16000 } + }, + "gemini-2.0-flash-lite": { + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "gemini-live-2.5-flash-preview-native-audio": { + "id": "gemini-live-2.5-flash-preview-native-audio", + "name": "Gemini Live 2.5 Flash Preview Native Audio", + "family": "gemini-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-09-18", + "modalities": { "input": ["text", "audio", "video"], "output": ["text", "audio"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2, "input_audio": 3, "output_audio": 12 }, + "limit": { "context": 131072, "output": 65536 } + }, + "gemini-2.0-flash": { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "gemini-2.5-flash-lite": { + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro-preview-06-05": { + "id": "gemini-2.5-pro-preview-06-05", + "name": "Gemini 2.5 Pro Preview 06-05", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-live-2.5-flash": { + "id": "gemini-live-2.5-flash", + "name": "Gemini Live 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-01", + "last_updated": "2025-09-01", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text", "audio"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2, "input_audio": 3, "output_audio": 12 }, + "limit": { "context": 128000, "output": 8000 } + }, + "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", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025, "input_audio": 0.3 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-image-preview": { + "id": "gemini-2.5-flash-image-preview", + "name": "Gemini 2.5 Flash Image (Preview)", + "family": "gemini-flash-image", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "modalities": { "input": ["text", "image"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 30, "cache_read": 0.075 }, + "limit": { "context": 32768, "output": 32768 } + }, + "gemini-2.5-flash-preview-09-2025": { + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09-25", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-preview-04-17": { + "id": "gemini-2.5-flash-preview-04-17", + "name": "Gemini 2.5 Flash Preview 04-17", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro-preview-tts": { + "id": "gemini-2.5-pro-preview-tts", + "name": "Gemini 2.5 Pro Preview TTS", + "family": "gemini-flash-tts", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", + "modalities": { "input": ["text"], "output": ["audio"] }, + "open_weights": false, + "cost": { "input": 1, "output": 20 }, + "limit": { "context": 8000, "output": 16000 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-1.5-flash": { + "id": "gemini-1.5-flash", + "name": "Gemini 1.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-05-14", + "last_updated": "2024-05-14", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.075, "output": 0.3, "cache_read": 0.01875 }, + "limit": { "context": 1000000, "output": 8192 } + }, + "gemini-1.5-flash-8b": { + "id": "gemini-1.5-flash-8b", + "name": "Gemini 1.5 Flash-8B", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-10-03", + "last_updated": "2024-10-03", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.0375, "output": 0.15, "cache_read": 0.01 }, + "limit": { "context": 1000000, "output": 8192 } + }, + "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-25", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-1.5-pro": { + "id": "gemini-1.5-pro", + "name": "Gemini 1.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-02-15", + "last_updated": "2024-02-15", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 5, "cache_read": 0.3125 }, + "limit": { "context": 1000000, "output": 8192 } + } + } + }, + "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-embedding-001": { + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "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, + "cost": { "input": 0.15, "output": 0 }, + "limit": { "context": 2048, "output": 3072 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 0.5, + "output": 3, + "cache_read": 0.05, + "context_over_200k": { "input": 0.5, "output": 3, "cache_read": 0.05 } + }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-preview-05-20": { + "id": "gemini-2.5-flash-preview-05-20", + "name": "Gemini 2.5 Flash Preview 05-20", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-flash-lite-latest": { + "id": "gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 2, + "output": 12, + "cache_read": 0.2, + "context_over_200k": { "input": 4, "output": 18, "cache_read": 0.4 } + }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.383 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-flash-latest": { + "id": "gemini-flash-latest", + "name": "Gemini Flash Latest", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.383 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro-preview-05-06": { + "id": "gemini-2.5-pro-preview-05-06", + "name": "Gemini 2.5 Pro Preview 05-06", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-05-06", + "last_updated": "2025-05-06", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.0-flash-lite": { + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "gemini-2.0-flash": { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "gemini-2.5-flash-lite": { + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro-preview-06-05": { + "id": "gemini-2.5-pro-preview-06-05", + "name": "Gemini 2.5 Pro Preview 06-05", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "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", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 65536, "output": 65536 } + }, + "gemini-2.5-flash-preview-09-2025": { + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09-25", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.383 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-flash-preview-04-17": { + "id": "gemini-2.5-flash-preview-04-17", + "name": "Gemini 2.5 Flash Preview 04-17", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "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-25", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "openai/gpt-oss-120b-maas": { + "id": "openai/gpt-oss-120b-maas", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.36 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-oss-20b-maas": { + "id": "openai/gpt-oss-20b-maas", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.25 }, + "limit": { "context": 131072, "output": 32768 } + } + } + }, + "cloudflare-workers-ai": { + "id": "cloudflare-workers-ai", + "env": ["CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_API_KEY"], + "npm": "workers-ai-provider", + "name": "Cloudflare Workers AI", + "doc": "https://developers.cloudflare.com/workers-ai/models/", + "models": { + "mistral-7b-instruct-v0.1-awq": { + "id": "mistral-7b-instruct-v0.1-awq", + "name": "@hf/thebloke/mistral-7b-instruct-v0.1-awq", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-09-27", + "last_updated": "2023-11-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "aura-1": { + "id": "aura-1", + "name": "@cf/deepgram/aura-1", + "family": "aura", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-08-27", + "last_updated": "2025-07-07", + "modalities": { "input": ["text"], "output": ["audio"] }, + "open_weights": true, + "cost": { "input": 0.015, "output": 0.015 }, + "limit": { "context": 0, "output": 0 } + }, + "mistral-7b-instruct-v0.2": { + "id": "mistral-7b-instruct-v0.2", + "name": "@hf/mistral/mistral-7b-instruct-v0.2", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-12-11", + "last_updated": "2025-07-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 3072, "input": 3072, "output": 4096 } + }, + "tinyllama-1.1b-chat-v1.0": { + "id": "tinyllama-1.1b-chat-v1.0", + "name": "@cf/tinyllama/tinyllama-1.1b-chat-v1.0", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-12-30", + "last_updated": "2024-03-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 2048, "output": 2048 }, + "status": "deprecated" + }, + "qwen1.5-0.5b-chat": { + "id": "qwen1.5-0.5b-chat", + "name": "@cf/qwen/qwen1.5-0.5b-chat", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-01-31", + "last_updated": "2024-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32000, "output": 32000 }, + "status": "deprecated" + }, + "llama-3.2-11b-vision-instruct": { + "id": "llama-3.2-11b-vision-instruct", + "name": "@cf/meta/llama-3.2-11b-vision-instruct", + "family": "llama-3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-18", + "last_updated": "2024-12-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.049, "output": 0.68 }, + "limit": { "context": 128000, "output": 128000 } + }, + "llama-2-13b-chat-awq": { + "id": "llama-2-13b-chat-awq", + "name": "@hf/thebloke/llama-2-13b-chat-awq", + "family": "llama-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-09-19", + "last_updated": "2023-11-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "llama-3.1-8b-instruct-fp8": { + "id": "llama-3.1-8b-instruct-fp8", + "name": "@cf/meta/llama-3.1-8b-instruct-fp8", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-25", + "last_updated": "2024-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.29 }, + "limit": { "context": 32000, "output": 32000 } + }, + "whisper": { + "id": "whisper", + "name": "@cf/openai/whisper", + "family": "whisper", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2023-11-07", + "last_updated": "2024-08-12", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.00045, "output": 0.00045 }, + "limit": { "context": 0, "output": 0 } + }, + "stable-diffusion-xl-base-1.0": { + "id": "stable-diffusion-xl-base-1.0", + "name": "@cf/stabilityai/stable-diffusion-xl-base-1.0", + "family": "stable-diffusion", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2023-07-25", + "last_updated": "2023-10-30", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "llama-2-7b-chat-fp16": { + "id": "llama-2-7b-chat-fp16", + "name": "@cf/meta/llama-2-7b-chat-fp16", + "family": "llama-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-07-26", + "last_updated": "2023-07-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.56, "output": 6.67 }, + "limit": { "context": 4096, "output": 4096 } + }, + "resnet-50": { + "id": "resnet-50", + "name": "@cf/microsoft/resnet-50", + "family": "resnet", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2022-03-16", + "last_updated": "2024-02-13", + "modalities": { "input": ["image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.0000025, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "stable-diffusion-v1-5-inpainting": { + "id": "stable-diffusion-v1-5-inpainting", + "name": "@cf/runwayml/stable-diffusion-v1-5-inpainting", + "family": "stable-diffusion", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-02-27", + "last_updated": "2024-02-27", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "sqlcoder-7b-2": { + "id": "sqlcoder-7b-2", + "name": "@cf/defog/sqlcoder-7b-2", + "family": "sqlcoder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-02-05", + "last_updated": "2024-02-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 10000, "output": 10000 } + }, + "llama-3-8b-instruct": { + "id": "llama-3-8b-instruct", + "name": "@cf/meta/llama-3-8b-instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-04-17", + "last_updated": "2025-06-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 0.83 }, + "limit": { "context": 7968, "output": 7968 } + }, + "llama-2-7b-chat-hf-lora": { + "id": "llama-2-7b-chat-hf-lora", + "name": "@cf/meta-llama/llama-2-7b-chat-hf-lora", + "family": "llama-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-07-13", + "last_updated": "2024-04-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "llama-3.1-8b-instruct": { + "id": "llama-3.1-8b-instruct", + "name": "@cf/meta/llama-3.1-8b-instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-18", + "last_updated": "2024-09-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 0.83 }, + "limit": { "context": 7968, "output": 7968 } + }, + "openchat-3.5-0106": { + "id": "openchat-3.5-0106", + "name": "@cf/openchat/openchat-3.5-0106", + "family": "openchat", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-01-07", + "last_updated": "2024-05-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 }, + "status": "deprecated" + }, + "openhermes-2.5-mistral-7b-awq": { + "id": "openhermes-2.5-mistral-7b-awq", + "name": "@hf/thebloke/openhermes-2.5-mistral-7b-awq", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-11-02", + "last_updated": "2023-11-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "lucid-origin": { + "id": "lucid-origin", + "name": "@cf/leonardo/lucid-origin", + "family": "lucid-origin", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-08-25", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "cost": { "input": 0.007, "output": 0.007 }, + "limit": { "context": 0, "output": 0 } + }, + "bart-large-cnn": { + "id": "bart-large-cnn", + "name": "@cf/facebook/bart-large-cnn", + "family": "bart-large-cnn", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2022-03-02", + "last_updated": "2024-02-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "flux-1-schnell": { + "id": "flux-1-schnell", + "name": "@cf/black-forest-labs/flux-1-schnell", + "family": "flux-1", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-07-31", + "last_updated": "2024-08-16", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0.000053, "output": 0.00011 }, + "limit": { "context": 2048, "output": 0 } + }, + "deepseek-r1-distill-qwen-32b": { + "id": "deepseek-r1-distill-qwen-32b", + "name": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-02-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 4.88 }, + "limit": { "context": 80000, "output": 80000 } + }, + "gemma-2b-it-lora": { + "id": "gemma-2b-it-lora", + "name": "@cf/google/gemma-2b-it-lora", + "family": "gemma-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-04-02", + "last_updated": "2024-04-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "una-cybertron-7b-v2-bf16": { + "id": "una-cybertron-7b-v2-bf16", + "name": "@cf/fblgit/una-cybertron-7b-v2-bf16", + "family": "una-cybertron", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-12-02", + "last_updated": "2024-03-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 15000, "output": 15000 }, + "status": "deprecated" + }, + "gemma-sea-lion-v4-27b-it": { + "id": "gemma-sea-lion-v4-27b-it", + "name": "@cf/aisingapore/gemma-sea-lion-v4-27b-it", + "family": "gemma", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-09-23", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 128000, "output": 0 } + }, + "m2m100-1.2b": { + "id": "m2m100-1.2b", + "name": "@cf/meta/m2m100-1.2b", + "family": "m2m100-1.2b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2022-03-02", + "last_updated": "2023-11-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.34, "output": 0.34 }, + "limit": { "context": 0, "output": 0 } + }, + "llama-3.2-3b-instruct": { + "id": "llama-3.2-3b-instruct", + "name": "@cf/meta/llama-3.2-3b-instruct", + "family": "llama-3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-18", + "last_updated": "2024-10-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.051, "output": 0.34 }, + "limit": { "context": 128000, "output": 128000 } + }, + "qwen2.5-coder-32b-instruct": { + "id": "qwen2.5-coder-32b-instruct", + "name": "@cf/qwen/qwen2.5-coder-32b-instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-11-06", + "last_updated": "2025-01-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.66, "output": 1 }, + "limit": { "context": 32768, "output": 32768 } + }, + "stable-diffusion-v1-5-img2img": { + "id": "stable-diffusion-v1-5-img2img", + "name": "@cf/runwayml/stable-diffusion-v1-5-img2img", + "family": "stable-diffusion", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-02-27", + "last_updated": "2024-02-27", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "gemma-7b-it-lora": { + "id": "gemma-7b-it-lora", + "name": "@cf/google/gemma-7b-it-lora", + "family": "gemma", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-04-02", + "last_updated": "2024-04-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 3500, "output": 3500 } + }, + "qwen1.5-14b-chat-awq": { + "id": "qwen1.5-14b-chat-awq", + "name": "@cf/qwen/qwen1.5-14b-chat-awq", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-02-03", + "last_updated": "2024-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 7500, "output": 7500 }, + "status": "deprecated" + }, + "qwen1.5-1.8b-chat": { + "id": "qwen1.5-1.8b-chat", + "name": "@cf/qwen/qwen1.5-1.8b-chat", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-01-30", + "last_updated": "2024-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32000, "output": 32000 }, + "status": "deprecated" + }, + "mistral-small-3.1-24b-instruct": { + "id": "mistral-small-3.1-24b-instruct", + "name": "@cf/mistralai/mistral-small-3.1-24b-instruct", + "family": "mistral-small", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-11", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gemma-7b-it": { + "id": "gemma-7b-it", + "name": "@hf/google/gemma-7b-it", + "family": "gemma", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-02-13", + "last_updated": "2024-08-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "qwen3-30b-a3b-fp8": { + "id": "qwen3-30b-a3b-fp8", + "name": "@cf/qwen/qwen3-30b-a3b-fp8", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-04-30", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.051, "output": 0.34 }, + "limit": { "context": 32768, "output": 0 } + }, + "llamaguard-7b-awq": { + "id": "llamaguard-7b-awq", + "name": "@hf/thebloke/llamaguard-7b-awq", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "hermes-2-pro-mistral-7b": { + "id": "hermes-2-pro-mistral-7b", + "name": "@hf/nousresearch/hermes-2-pro-mistral-7b", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-03-11", + "last_updated": "2024-09-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 24000, "output": 24000 } + }, + "granite-4.0-h-micro": { + "id": "granite-4.0-h-micro", + "name": "@cf/ibm-granite/granite-4.0-h-micro", + "family": "granite", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-07", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.017, "output": 0.11 }, + "limit": { "context": 131000, "output": 0 } + }, + "falcon-7b-instruct": { + "id": "falcon-7b-instruct", + "name": "@cf/tiiuae/falcon-7b-instruct", + "family": "falcon-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-04-25", + "last_updated": "2024-10-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "llama-3.3-70b-instruct-fp8-fast": { + "id": "llama-3.3-70b-instruct-fp8-fast", + "name": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "family": "llama-3.3", + "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, + "cost": { "input": 0.29, "output": 2.25 }, + "limit": { "context": 24000, "output": 24000 } + }, + "llama-3-8b-instruct-awq": { + "id": "llama-3-8b-instruct-awq", + "name": "@cf/meta/llama-3-8b-instruct-awq", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-05-09", + "last_updated": "2024-05-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.12, "output": 0.27 }, + "limit": { "context": 8192, "output": 8192 } + }, + "phoenix-1.0": { + "id": "phoenix-1.0", + "name": "@cf/leonardo/phoenix-1.0", + "family": "phoenix", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-08-25", + "last_updated": "2025-08-25", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "cost": { "input": 0.0058, "output": 0.0058 }, + "limit": { "context": 0, "output": 0 } + }, + "phi-2": { + "id": "phi-2", + "name": "@cf/microsoft/phi-2", + "family": "phi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-12-13", + "last_updated": "2024-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 2048, "output": 2048 } + }, + "dreamshaper-8-lcm": { + "id": "dreamshaper-8-lcm", + "name": "@cf/lykon/dreamshaper-8-lcm", + "family": "dreamshaper-8-lcm", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2023-12-06", + "last_updated": "2023-12-07", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "discolm-german-7b-v1-awq": { + "id": "discolm-german-7b-v1-awq", + "name": "@cf/thebloke/discolm-german-7b-v1-awq", + "family": "discolm-german", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-01-18", + "last_updated": "2024-01-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "llama-2-7b-chat-int8": { + "id": "llama-2-7b-chat-int8", + "name": "@cf/meta/llama-2-7b-chat-int8", + "family": "llama-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-09-25", + "last_updated": "2023-09-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.556, "output": 6.667 }, + "limit": { "context": 8192, "output": 8192 } + }, + "llama-3.2-1b-instruct": { + "id": "llama-3.2-1b-instruct", + "name": "@cf/meta/llama-3.2-1b-instruct", + "family": "llama-3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-18", + "last_updated": "2024-10-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.027, "output": 0.2 }, + "limit": { "context": 60000, "output": 60000 } + }, + "whisper-large-v3-turbo": { + "id": "whisper-large-v3-turbo", + "name": "@cf/openai/whisper-large-v3-turbo", + "family": "whisper-large", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-10-01", + "last_updated": "2024-10-04", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.00051, "output": 0.00051 }, + "limit": { "context": 0, "output": 0 } + }, + "llama-4-scout-17b-16e-instruct": { + "id": "llama-4-scout-17b-16e-instruct", + "name": "@cf/meta/llama-4-scout-17b-16e-instruct", + "family": "llama-4-scout", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-04-02", + "last_updated": "2025-05-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.85 }, + "limit": { "context": 131000, "output": 131000 } + }, + "starling-lm-7b-beta": { + "id": "starling-lm-7b-beta", + "name": "@hf/nexusflow/starling-lm-7b-beta", + "family": "starling-lm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-03-19", + "last_updated": "2024-04-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "input": 3072, "output": 4096 }, + "status": "deprecated" + }, + "deepseek-coder-6.7b-base-awq": { + "id": "deepseek-coder-6.7b-base-awq", + "name": "@hf/thebloke/deepseek-coder-6.7b-base-awq", + "family": "deepseek-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-11-05", + "last_updated": "2023-11-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "gemma-3-12b-it": { + "id": "gemma-3-12b-it", + "name": "@cf/google/gemma-3-12b-it", + "family": "gemma-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-01", + "last_updated": "2025-03-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 80000, "output": 80000 } + }, + "llama-guard-3-8b": { + "id": "llama-guard-3-8b", + "name": "@cf/meta/llama-guard-3-8b", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-07-22", + "last_updated": "2024-10-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.48, "output": 0.03 }, + "limit": { "context": 131072, "output": 0 } + }, + "neural-chat-7b-v3-1-awq": { + "id": "neural-chat-7b-v3-1-awq", + "name": "@hf/thebloke/neural-chat-7b-v3-1-awq", + "family": "neural-chat-7b-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-11-15", + "last_updated": "2023-11-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "whisper-tiny-en": { + "id": "whisper-tiny-en", + "name": "@cf/openai/whisper-tiny-en", + "family": "whisper", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2022-09-26", + "last_updated": "2024-01-22", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "stable-diffusion-xl-lightning": { + "id": "stable-diffusion-xl-lightning", + "name": "@cf/bytedance/stable-diffusion-xl-lightning", + "family": "stable-diffusion", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-02-20", + "last_updated": "2024-04-03", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "mistral-7b-instruct-v0.1": { + "id": "mistral-7b-instruct-v0.1", + "name": "@cf/mistral/mistral-7b-instruct-v0.1", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-09-27", + "last_updated": "2025-07-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.11, "output": 0.19 }, + "limit": { "context": 2824, "output": 2824 } + }, + "llava-1.5-7b-hf": { + "id": "llava-1.5-7b-hf", + "name": "@cf/llava-hf/llava-1.5-7b-hf", + "family": "llava-1.5-7b-hf", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2023-12-05", + "last_updated": "2025-06-06", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "gpt-oss-20b": { + "id": "gpt-oss-20b", + "name": "@cf/openai/gpt-oss-20b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "release_date": "2025-08-04", + "last_updated": "2025-08-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.3 }, + "limit": { "context": 128000, "output": 128000 } + }, + "deepseek-math-7b-instruct": { + "id": "deepseek-math-7b-instruct", + "name": "@cf/deepseek-ai/deepseek-math-7b-instruct", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-02-05", + "last_updated": "2024-02-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "@cf/openai/gpt-oss-120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "release_date": "2025-08-04", + "last_updated": "2025-08-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 0.75 }, + "limit": { "context": 128000, "output": 128000 } + }, + "melotts": { + "id": "melotts", + "name": "@cf/myshell-ai/melotts", + "family": "melotts", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-07-19", + "last_updated": "2024-07-19", + "modalities": { "input": ["text"], "output": ["audio"] }, + "open_weights": true, + "cost": { "input": 0.0002, "output": 0 }, + "limit": { "context": 0, "output": 0 } + }, + "qwen1.5-7b-chat-awq": { + "id": "qwen1.5-7b-chat-awq", + "name": "@cf/qwen/qwen1.5-7b-chat-awq", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-02-03", + "last_updated": "2024-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 20000, "output": 20000 }, + "status": "deprecated" + }, + "llama-3.1-8b-instruct-fast": { + "id": "llama-3.1-8b-instruct-fast", + "name": "@cf/meta/llama-3.1-8b-instruct-fast", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-18", + "last_updated": "2024-09-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.045, "output": 0.384 }, + "limit": { "context": 128000, "output": 128000 } + }, + "nova-3": { + "id": "nova-3", + "name": "@cf/deepgram/nova-3", + "family": "nova", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06-05", + "last_updated": "2025-07-08", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.0052, "output": 0.0052 }, + "limit": { "context": 0, "output": 0 } + }, + "llama-3.1-70b-instruct": { + "id": "llama-3.1-70b-instruct", + "name": "@cf/meta/llama-3.1-70b-instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-16", + "last_updated": "2024-12-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.293, "output": 2.253 }, + "limit": { "context": 24000, "output": 24000 } + }, + "qwq-32b": { + "id": "qwq-32b", + "name": "@cf/qwen/qwq-32b", + "family": "qwq", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-05", + "last_updated": "2025-03-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.66, "output": 1 }, + "limit": { "context": 24000, "output": 24000 } + }, + "zephyr-7b-beta-awq": { + "id": "zephyr-7b-beta-awq", + "name": "@hf/thebloke/zephyr-7b-beta-awq", + "family": "zephyr", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-10-27", + "last_updated": "2023-11-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "deepseek-coder-6.7b-instruct-awq": { + "id": "deepseek-coder-6.7b-instruct-awq", + "name": "@hf/thebloke/deepseek-coder-6.7b-instruct-awq", + "family": "deepseek-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2023-11-05", + "last_updated": "2023-11-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 4096, "output": 4096 }, + "status": "deprecated" + }, + "llama-3.1-8b-instruct-awq": { + "id": "llama-3.1-8b-instruct-awq", + "name": "@cf/meta/llama-3.1-8b-instruct-awq", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-25", + "last_updated": "2024-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.12, "output": 0.27 }, + "limit": { "context": 8192, "output": 8192 } + }, + "mistral-7b-instruct-v0.2-lora": { + "id": "mistral-7b-instruct-v0.2-lora", + "name": "@cf/mistral/mistral-7b-instruct-v0.2-lora", + "family": "mistral-7b", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-04-01", + "last_updated": "2024-04-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 15000, "output": 15000 } + }, + "uform-gen2-qwen-500m": { + "id": "uform-gen2-qwen-500m", + "name": "@cf/unum/uform-gen2-qwen-500m", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-02-15", + "last_updated": "2024-04-24", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 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-coder": { + "id": "mercury-coder", + "name": "Mercury Coder", + "family": "mercury-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2025-02-26", + "last_updated": "2025-07-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1, "cache_read": 0.25, "cache_write": 1 }, + "limit": { "context": 128000, "output": 16384 } + }, + "mercury": { + "id": "mercury", + "name": "Mercury", + "family": "mercury", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2025-06-26", + "last_updated": "2025-07-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1, "cache_read": 0.25, "cache_write": 1 }, + "limit": { "context": 128000, "output": 16384 } + } + } + }, + "wandb": { + "id": "wandb", + "env": ["WANDB_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.inference.wandb.ai/v1", + "name": "Weights & Biases", + "doc": "https://weave-docs.wandb.ai/guides/integrations/inference/", + "models": { + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "Kimi-K2-Instruct", + "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, + "cost": { "input": 1.35, "output": 4 }, + "limit": { "context": 128000, "output": 16384 } + }, + "microsoft/Phi-4-mini-instruct": { + "id": "microsoft/Phi-4-mini-instruct", + "name": "Phi-4-mini-instruct", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.08, "output": 0.35 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama/Llama-3.1-8B-Instruct": { + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.22, "output": 0.22 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta-llama/Llama-3.3-70B-Instruct": { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.71, "output": 0.71 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta-llama/Llama-4-Scout-17B-16E-Instruct": { + "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "family": "llama-4-scout", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.17, "output": 0.66 }, + "limit": { "context": 64000, "output": 8192 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 262144, "output": 131072 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder-480B-A35B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 1, "output": 1.5 }, + "limit": { "context": 262144, "output": 66536 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 262144, "output": 131072 } + }, + "deepseek-ai/DeepSeek-R1-0528": { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek-R1-0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 161000, "output": 163840 } + }, + "deepseek-ai/DeepSeek-V3-0324": { + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek-V3-0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.14, "output": 2.75 }, + "limit": { "context": 161000, "output": 8192 } + } + } + }, + "cloudflare-ai-gateway": { + "id": "cloudflare-ai-gateway", + "env": ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_GATEWAY_ID"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://gateway.ai.cloudflare.com/v1/${CLOUDFLARE_ACCOUNT_ID}/${CLOUDFLARE_GATEWAY_ID}/compat/", + "name": "Cloudflare AI Gateway", + "doc": "https://developers.cloudflare.com/ai-gateway/", + "models": { + "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", + "family": "granite-4", + "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, + "cost": { "input": 0.017, "output": 0.11 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/facebook/bart-large-cnn": { + "id": "workers-ai/@cf/facebook/bart-large-cnn", + "name": "BART Large CNN", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "mistral-7b", + "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, + "cost": { "input": 0.11, "output": 0.19 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/huggingface/distilbert-sst-2-int8": { + "id": "workers-ai/@cf/huggingface/distilbert-sst-2-int8", + "name": "DistilBERT SST-2 INT8", + "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, + "cost": { "input": 0.026, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/myshell-ai/melotts": { + "id": "workers-ai/@cf/myshell-ai/melotts", + "name": "MyShell MeloTTS", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/google/gemma-3-12b-it": { + "id": "workers-ai/@cf/google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "family": "gemma-3", + "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, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/pfnet/plamo-embedding-1b": { + "id": "workers-ai/@cf/pfnet/plamo-embedding-1b", + "name": "PLaMo Embedding 1B", + "family": "plamo-embedding", + "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, + "cost": { "input": 0.019, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/openai/gpt-oss-20b": { + "id": "workers-ai/@cf/openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "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, + "cost": { "input": 0.2, "output": 0.3 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/openai/gpt-oss-120b": { + "id": "workers-ai/@cf/openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "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, + "cost": { "input": 0.35, "output": 0.75 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B": { + "id": "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", + "name": "IndicTrans2 EN-Indic 1B", + "family": "indictrans2", + "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, + "cost": { "input": 0.34, "output": 0.34 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/pipecat-ai/smart-turn-v2": { + "id": "workers-ai/@cf/pipecat-ai/smart-turn-v2", + "name": "Pipecat Smart Turn v2", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "qwen2.5-coder", + "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, + "cost": { "input": 0.66, "output": 1 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8": { + "id": "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", + "name": "Qwen3 30B A3B FP8", + "family": "qwen3", + "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, + "cost": { "input": 0.051, "output": 0.34 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/qwen/qwen3-embedding-0.6b": { + "id": "workers-ai/@cf/qwen/qwen3-embedding-0.6b", + "name": "Qwen3 Embedding 0.6B", + "family": "qwen3-embedding", + "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, + "cost": { "input": 0.012, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/qwen/qwq-32b": { + "id": "workers-ai/@cf/qwen/qwq-32b", + "name": "QwQ 32B", + "family": "qwq", + "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, + "cost": { "input": 0.66, "output": 1 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "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, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/deepgram/aura-2-es": { + "id": "workers-ai/@cf/deepgram/aura-2-es", + "name": "Deepgram Aura 2 (ES)", + "family": "aura-2", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/deepgram/aura-2-en": { + "id": "workers-ai/@cf/deepgram/aura-2-en", + "name": "Deepgram Aura 2 (EN)", + "family": "aura-2", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/deepgram/nova-3": { + "id": "workers-ai/@cf/deepgram/nova-3", + "name": "Deepgram Nova 3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "gemma-sea-lion", + "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, + "cost": { "input": 0.35, "output": 0.56 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.2-vision", + "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, + "cost": { "input": 0.049, "output": 0.68 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.1", + "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, + "cost": { "input": 0.15, "output": 0.29 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-2", + "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, + "cost": { "input": 0.56, "output": 6.67 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/meta/llama-3-8b-instruct": { + "id": "workers-ai/@cf/meta/llama-3-8b-instruct", + "name": "Llama 3 8B Instruct", + "family": "llama-3", + "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, + "cost": { "input": 0.28, "output": 0.83 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.1", + "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, + "cost": { "input": 0.28, "output": 0.8299999999999998 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/meta/m2m100-1.2b": { + "id": "workers-ai/@cf/meta/m2m100-1.2b", + "name": "M2M100 1.2B", + "family": "m2m100", + "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, + "cost": { "input": 0.34, "output": 0.34 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.2", + "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, + "cost": { "input": 0.051, "output": 0.34 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.3", + "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, + "cost": { "input": 0.29, "output": 2.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3", + "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, + "cost": { "input": 0.12, "output": 0.27 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.2", + "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, + "cost": { "input": 0.027, "output": 0.2 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-4-scout", + "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, + "cost": { "input": 0.27, "output": 0.85 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/meta/llama-guard-3-8b": { + "id": "workers-ai/@cf/meta/llama-guard-3-8b", + "name": "Llama Guard 3 8B", + "family": "llama-guard", + "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, + "cost": { "input": 0.48, "output": 0.03 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "llama-3.1", + "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, + "cost": { "input": 0.12, "output": 0.27 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/baai/bge-m3": { + "id": "workers-ai/@cf/baai/bge-m3", + "name": "BGE M3", + "family": "bge-m3", + "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, + "cost": { "input": 0.012, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "bge-base", + "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, + "cost": { "input": 0.067, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "bge-large", + "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, + "cost": { "input": 0.2, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "workers-ai/@cf/baai/bge-reranker-base": { + "id": "workers-ai/@cf/baai/bge-reranker-base", + "name": "BGE Reranker Base", + "family": "bge-reranker", + "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, + "cost": { "input": 0.0031, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "bge-small", + "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, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "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", + "family": "deepseek-r1-distill-qwen", + "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, + "cost": { "input": 0.5, "output": 4.88 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-4": { + "id": "openai/gpt-4", + "name": "GPT-4", + "family": "gpt-4", + "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, + "cost": { "input": 30, "output": 60 }, + "limit": { "context": 8192, "output": 8192 } + }, + "openai/gpt-5.1-codex": { + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-3.5-turbo": { + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.5, "output": 1.5, "cache_read": 1.25 }, + "limit": { "context": 16385, "output": 4096 } + }, + "openai/gpt-4-turbo": { + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai/o3-mini": { + "id": "openai/o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5.1": { + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4o": { + "id": "openai/gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o1": { + "id": "openai/o1", + "name": "o1", + "family": "o1", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o3-pro": { + "id": "openai/o3-pro", + "name": "o3-pro", + "family": "o3-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 20, "output": 80 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o3": { + "id": "openai/o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5.2": { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-opus-4-1": { + "id": "anthropic/claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-haiku-4-5": { + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3-haiku": { + "id": "anthropic/claude-3-haiku", + "name": "Claude Haiku 3", + "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, + "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic/claude-opus-4-5": { + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3-opus": { + "id": "anthropic/claude-3-opus", + "name": "Claude Opus 3", + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic/claude-sonnet-4-5": { + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-3.5-sonnet": { + "id": "anthropic/claude-3.5-sonnet", + "name": "Claude Sonnet 3.5 v2", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-3-sonnet": { + "id": "anthropic/claude-3-sonnet", + "name": "Claude Sonnet 3", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic/claude-3-5-haiku": { + "id": "anthropic/claude-3-5-haiku", + "name": "Claude Haiku 3.5 (latest)", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-3.5-haiku": { + "id": "anthropic/claude-3.5-haiku", + "name": "Claude Haiku 3.5 (latest)", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + } + } + }, + "openai": { + "id": "openai", + "env": ["OPENAI_API_KEY"], + "npm": "@ai-sdk/openai", + "name": "OpenAI", + "doc": "https://platform.openai.com/docs/models", + "models": { + "gpt-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "family": "gpt-4.1-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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "text-embedding-3-small": { + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "family": "text-embedding-3-small", + "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, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8191, "output": 1536 } + }, + "gpt-4": { + "id": "gpt-4", + "name": "GPT-4", + "family": "gpt-4", + "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, + "cost": { "input": 30, "output": 60 }, + "limit": { "context": 8192, "output": 8192 } + }, + "o1-pro": { + "id": "o1-pro", + "name": "o1-pro", + "family": "o1-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 150, "output": 600 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-4o-2024-05-13": { + "id": "gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "family": "gpt-4o", + "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, + "cost": { "input": 5, "output": 15 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o-2024-08-06": { + "id": "gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "o3-deep-research": { + "id": "o3-deep-research", + "name": "o3-deep-research", + "family": "o3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-05", + "release_date": "2024-06-26", + "last_updated": "2024-06-26", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 10, "output": 40, "cache_read": 2.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-3.5-turbo": { + "id": "gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.5, "output": 1.5, "cache_read": 1.25 }, + "limit": { "context": 16385, "output": 4096 } + }, + "gpt-5.2-pro": { + "id": "gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 21, "output": 168 }, + "limit": { "context": 400000, "output": 128000 } + }, + "text-embedding-3-large": { + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "family": "text-embedding-3-large", + "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, + "cost": { "input": 0.13, "output": 0 }, + "limit": { "context": 8191, "output": 3072 } + }, + "gpt-4-turbo": { + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "o1-preview": { + "id": "o1-preview", + "name": "o1-preview", + "family": "o1-preview", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "family": "gpt-5-codex-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "output": 128000 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5.2-chat-latest": { + "id": "gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "codex-mini-latest": { + "id": "codex-mini-latest", + "name": "Codex Mini", + "family": "codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.375 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "o1": { + "id": "o1", + "name": "o1", + "family": "o1", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 128000 } + }, + "o1-mini": { + "id": "o1-mini", + "name": "o1-mini", + "family": "o1-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": false, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 128000, "output": 65536 } + }, + "text-embedding-ada-002": { + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "family": "text-embedding-ada", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "o3-pro": { + "id": "o3-pro", + "name": "o3-pro", + "family": "o3-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 20, "output": 80 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-4o-2024-11-20": { + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "o3": { + "id": "o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "o4-mini-deep-research": { + "id": "o4-mini-deep-research", + "name": "o4-mini-deep-research", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-05", + "release_date": "2024-06-26", + "last_updated": "2024-06-26", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-5-chat-latest": { + "id": "gpt-5-chat-latest", + "name": "GPT-5 Chat (latest)", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.1-chat-latest": { + "id": "gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 128000, "output": 16384 } + } + } + }, + "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-4.6v-flash": { + "id": "glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.5v": { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 64000, "output": 16384 } + }, + "glm-4.5-air": { + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5": { + "id": "glm-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5-flash": { + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "family": "glm-4.5-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, + "minimax-cn": { + "id": "minimax-cn", + "env": ["MINIMAX_API_KEY"], + "npm": "@ai-sdk/anthropic", + "api": "https://api.minimaxi.com/anthropic/v1", + "name": "MiniMax (China)", + "doc": "https://platform.minimaxi.com/docs/guides/quickstart", + "models": { + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 204800, "output": 131072 } + }, + "MiniMax-M2": { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 196608, "output": 128000 } + } + } + }, + "perplexity": { + "id": "perplexity", + "env": ["PERPLEXITY_API_KEY"], + "npm": "@ai-sdk/perplexity", + "name": "Perplexity", + "doc": "https://docs.perplexity.ai", + "models": { + "sonar": { + "id": "sonar", + "name": "Sonar", + "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, + "cost": { "input": 1, "output": 1 }, + "limit": { "context": 128000, "output": 4096 } + }, + "sonar-pro": { + "id": "sonar-pro", + "name": "Sonar Pro", + "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, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 8192 } + }, + "sonar-reasoning-pro": { + "id": "sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "family": "sonar-reasoning", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 128000, "output": 4096 } + } + } + }, + "openrouter": { + "id": "openrouter", + "env": ["OPENROUTER_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://openrouter.ai/api/v1", + "name": "OpenRouter", + "doc": "https://openrouter.ai/models", + "models": { + "moonshotai/kimi-k2": { + "id": "moonshotai/kimi-k2", + "name": "Kimi K2", + "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, + "cost": { "input": 0.55, "output": 2.2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "moonshotai/kimi-k2-0905": { + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 Instruct 0905", + "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, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 16384 } + }, + "moonshotai/kimi-dev-72b:free": { + "id": "moonshotai/kimi-dev-72b:free", + "name": "Kimi Dev 72b (free)", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-06-16", + "last_updated": "2025-06-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "moonshotai/kimi-k2-0905:exacto": { + "id": "moonshotai/kimi-k2-0905:exacto", + "name": "Kimi K2 Instruct 0905 (exacto)", + "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, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 16384 } + }, + "moonshotai/kimi-k2:free": { + "id": "moonshotai/kimi-k2:free", + "name": "Kimi K2 (free)", + "family": "kimi-k2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32800, "output": 32800 } + }, + "thudm/glm-z1-32b:free": { + "id": "thudm/glm-z1-32b:free", + "name": "GLM Z1 32B (free)", + "family": "glm-z1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "nousresearch/hermes-4-70b": { + "id": "nousresearch/hermes-4-70b", + "name": "Hermes 4 70B", + "family": "hermes", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2025-08-25", + "last_updated": "2025-08-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.4 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nousresearch/hermes-4-405b": { + "id": "nousresearch/hermes-4-405b", + "name": "Hermes 4 405B", + "family": "hermes", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2025-08-25", + "last_updated": "2025-08-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nousresearch/deephermes-3-llama-3-8b-preview": { + "id": "nousresearch/deephermes-3-llama-3-8b-preview", + "name": "DeepHermes 3 Llama 3 8B Preview", + "family": "llama-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-02-28", + "last_updated": "2025-02-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "nvidia/nemotron-nano-9b-v2": { + "id": "nvidia/nemotron-nano-9b-v2", + "name": "nvidia-nemotron-nano-9b-v2", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.04, "output": 0.16 }, + "limit": { "context": 131072, "output": 131072 } + }, + "x-ai/grok-4": { + "id": "x-ai/grok-4", + "name": "Grok 4", + "family": "grok-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.75, "cache_write": 15 }, + "limit": { "context": 256000, "output": 64000 } + }, + "x-ai/grok-code-fast-1": { + "id": "x-ai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "x-ai/grok-3": { + "id": "x-ai/grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75, "cache_write": 15 }, + "limit": { "context": 131072, "output": 8192 } + }, + "x-ai/grok-4-fast": { + "id": "x-ai/grok-4-fast", + "name": "Grok 4 Fast", + "family": "grok-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-08-19", + "last_updated": "2025-08-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05, "cache_write": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "x-ai/grok-3-beta": { + "id": "x-ai/grok-3-beta", + "name": "Grok 3 Beta", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75, "cache_write": 15 }, + "limit": { "context": 131072, "output": 8192 } + }, + "x-ai/grok-3-mini-beta": { + "id": "x-ai/grok-3-mini-beta", + "name": "Grok 3 Mini Beta", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "cache_read": 0.075, "cache_write": 0.5 }, + "limit": { "context": 131072, "output": 8192 } + }, + "x-ai/grok-3-mini": { + "id": "x-ai/grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "cache_read": 0.075, "cache_write": 0.5 }, + "limit": { "context": 131072, "output": 8192 } + }, + "x-ai/grok-4.1-fast": { + "id": "x-ai/grok-4.1-fast", + "name": "Grok 4.1 Fast", + "family": "grok-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05, "cache_write": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "kwaipilot/kat-coder-pro:free": { + "id": "kwaipilot/kat-coder-pro:free", + "name": "Kat Coder Pro (free)", + "family": "kat-coder-pro", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-10", + "last_updated": "2025-11-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 65536 } + }, + "cognitivecomputations/dolphin3.0-mistral-24b": { + "id": "cognitivecomputations/dolphin3.0-mistral-24b", + "name": "Dolphin3.0 Mistral 24B", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-02-13", + "last_updated": "2025-02-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "cognitivecomputations/dolphin3.0-r1-mistral-24b": { + "id": "cognitivecomputations/dolphin3.0-r1-mistral-24b", + "name": "Dolphin3.0 R1 Mistral 24B", + "family": "mistral", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-02-13", + "last_updated": "2025-02-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "deepseek/deepseek-chat-v3.1": { + "id": "deepseek/deepseek-chat-v3.1", + "name": "DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek/deepseek-r1:free": { + "id": "deepseek/deepseek-r1:free", + "name": "R1 (free)", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek/deepseek-v3.2-speciale": { + "id": "deepseek/deepseek-v3.2-speciale", + "name": "DeepSeek V3.2 Speciale", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 0.41 }, + "limit": { "context": 163840, "output": 65536 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "deepseek/deepseek-v3-base:free": { + "id": "deepseek/deepseek-v3-base:free", + "name": "DeepSeek V3 Base (free)", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-03-29", + "last_updated": "2025-03-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek/deepseek-v3.1-terminus": { + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 131072, "output": 65536 } + }, + "deepseek/deepseek-r1-0528-qwen3-8b:free": { + "id": "deepseek/deepseek-r1-0528-qwen3-8b:free", + "name": "Deepseek R1 0528 Qwen3 8B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-05-29", + "last_updated": "2025-05-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "deepseek/deepseek-chat-v3-0324": { + "id": "deepseek/deepseek-chat-v3-0324", + "name": "DeepSeek V3 0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 16384, "output": 8192 } + }, + "deepseek/deepseek-r1-0528:free": { + "id": "deepseek/deepseek-r1-0528:free", + "name": "R1 0528 (free)", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek/deepseek-r1-distill-llama-70b": { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "deepseek/deepseek-r1-distill-qwen-14b": { + "id": "deepseek/deepseek-r1-distill-qwen-14b", + "name": "DeepSeek R1 Distill Qwen 14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-01-29", + "last_updated": "2025-01-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 64000, "output": 8192 } + }, + "deepseek/deepseek-v3.1-terminus:exacto": { + "id": "deepseek/deepseek-v3.1-terminus:exacto", + "name": "DeepSeek V3.1 Terminus (exacto)", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 131072, "output": 65536 } + }, + "deepseek/deepseek-v3.2": { + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 0.4 }, + "limit": { "context": 163840, "output": 65536 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "featherless/qwerky-72b": { + "id": "featherless/qwerky-72b", + "name": "Qwerky 72B", + "family": "qwerky", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "tngtech/deepseek-r1t2-chimera:free": { + "id": "tngtech/deepseek-r1t2-chimera:free", + "name": "DeepSeek R1T2 Chimera (free)", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-07-08", + "last_updated": "2025-07-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "minimax/minimax-m1": { + "id": "minimax/minimax-m1", + "name": "MiniMax M1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 2.2 }, + "limit": { "context": 1000000, "output": 40000 } + }, + "minimax/minimax-m2": { + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "release_date": "2025-10-23", + "last_updated": "2025-10-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 1.15, "cache_read": 0.28, "cache_write": 1.15 }, + "limit": { "context": 196600, "output": 118000 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "minimax/minimax-01": { + "id": "minimax/minimax-01", + "name": "MiniMax-01", + "family": "minimax", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-15", + "last_updated": "2025-01-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 1.1 }, + "limit": { "context": 1000000, "output": 1000000 } + }, + "minimax/minimax-m2.1": { + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 204800, "output": 131072 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "google/gemini-2.0-flash-001": { + "id": "google/gemini-2.0-flash-001", + "name": "Gemini 2.0 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "google/gemma-2-9b-it:free": { + "id": "google/gemma-2-9b-it:free", + "name": "Gemma 2 9B (free)", + "family": "gemma-2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2024-06-28", + "last_updated": "2024-06-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "google/gemini-3-flash-preview": { + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "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, + "cost": { "input": 0.5, "output": 3, "cache_read": 0.05 }, + "limit": { "context": 1048576, "output": 65536 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "google/gemini-3-pro-preview": { + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 12 }, + "limit": { "context": 1050000, "output": 66000 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "google/gemini-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.0375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "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", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-05-06", + "last_updated": "2025-05-06", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemma-3n-e4b-it": { + "id": "google/gemma-3n-e4b-it", + "name": "Gemma 3n E4B IT", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "google/gemini-2.5-flash-lite": { + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-pro-preview-06-05": { + "id": "google/gemini-2.5-pro-preview-06-05", + "name": "Gemini 2.5 Pro Preview 06-05", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-flash-preview-09-2025": { + "id": "google/gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09-25", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.031 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemma-3-12b-it": { + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 96000, "output": 8192 } + }, + "google/gemma-3n-e4b-it:free": { + "id": "google/gemma-3n-e4b-it:free", + "name": "Gemma 3n 4B (free)", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "google/gemini-2.5-flash-lite-preview-09-2025": { + "id": "google/gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview 09-25", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.0-flash-exp:free": { + "id": "google/gemini-2.0-flash-exp:free", + "name": "Gemini 2.0 Flash Experimental (free)", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1048576, "output": 1048576 } + }, + "google/gemma-3-27b-it": { + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 96000, "output": 8192 } + }, + "microsoft/mai-ds-r1:free": { + "id": "microsoft/mai-ds-r1:free", + "name": "MAI DS R1 (free)", + "family": "mai-ds-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04-21", + "last_updated": "2025-04-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 163840 } + }, + "openai/gpt-oss-safeguard-20b": { + "id": "openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 131072, "output": 65536 } + }, + "openai/gpt-5.1-codex": { + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "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"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4.1-mini": { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-5-chat": { + "id": "openai/gpt-5-chat", + "name": "GPT-5 Chat (latest)", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "tool_call": false, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.2-pro": { + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 21, "output": 168 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.1-codex-mini": { + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-Mini", + "family": "gpt-5-codex-mini", + "attachment": true, + "reasoning": true, + "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"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "output": 100000 } + }, + "openai/gpt-5.2-chat-latest": { + "id": "openai/gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5.1": { + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-nano": { + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-codex": { + "id": "openai/gpt-5-codex", + "name": "GPT-5 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10-01", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-oss-120b:exacto": { + "id": "openai/gpt-oss-120b:exacto", + "name": "GPT OSS 120B (exacto)", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.24 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "o4 Mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5.1-chat": { + "id": "openai/gpt-5.1-chat", + "name": "GPT-5.1 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5-mini": { + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-image": { + "id": "openai/gpt-5-image", + "name": "GPT-5 Image", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10-01", + "release_date": "2025-10-14", + "last_updated": "2025-10-14", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.072, "output": 0.28 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o-mini", + "family": "gpt-4o-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-pro": { + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "openai/gpt-5.2": { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openrouter/sherlock-think-alpha": { + "id": "openrouter/sherlock-think-alpha", + "name": "Sherlock Think Alpha", + "family": "sherlock", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-15", + "last_updated": "2025-12-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1840000, "output": 0 } + }, + "openrouter/sherlock-dash-alpha": { + "id": "openrouter/sherlock-dash-alpha", + "name": "Sherlock Dash Alpha", + "family": "sherlock", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-15", + "last_updated": "2025-12-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1840000, "output": 0 } + }, + "z-ai/glm-4.7": { + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 204800, "output": 131072 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, + "z-ai/glm-4.5": { + "id": "z-ai/glm-4.5", + "name": "GLM 4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 96000 } + }, + "z-ai/glm-4.5-air": { + "id": "z-ai/glm-4.5-air", + "name": "GLM 4.5 Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.1 }, + "limit": { "context": 128000, "output": 96000 } + }, + "z-ai/glm-4.5v": { + "id": "z-ai/glm-4.5v", + "name": "GLM 4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 1.8 }, + "limit": { "context": 64000, "output": 16384 } + }, + "z-ai/glm-4.6": { + "id": "z-ai/glm-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 200000, "output": 128000 } + }, + "z-ai/glm-4.6:exacto": { + "id": "z-ai/glm-4.6:exacto", + "name": "GLM 4.6 (exacto)", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 1.9, "cache_read": 0.11 }, + "limit": { "context": 200000, "output": 128000 } + }, + "z-ai/glm-4.5-air:free": { + "id": "z-ai/glm-4.5-air:free", + "name": "GLM 4.5 Air (free)", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 96000 } + }, + "qwen/qwen3-coder": { + "id": "qwen/qwen3-coder", + "name": "Qwen3 Coder", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 262144, "output": 66536 } + }, + "qwen/qwen3-32b:free": { + "id": "qwen/qwen3-32b:free", + "name": "Qwen3 32B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 40960, "output": 40960 } + }, + "qwen/qwen3-next-80b-a3b-instruct": { + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262144, "output": 262144 } + }, + "qwen/qwen-2.5-coder-32b-instruct": { + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-11-11", + "last_updated": "2024-11-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "qwen/qwen3-235b-a22b:free": { + "id": "qwen/qwen3-235b-a22b:free", + "name": "Qwen3 235B A22B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "qwen/qwen3-coder-flash": { + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 128000, "output": 66536 } + }, + "qwen/qwq-32b:free": { + "id": "qwen/qwq-32b:free", + "name": "QwQ 32B (free)", + "family": "qwq", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-03-05", + "last_updated": "2025-03-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "qwen/qwen3-30b-a3b-thinking-2507": { + "id": "qwen/qwen3-30b-a3b-thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 262000, "output": 262000 } + }, + "qwen/qwen3-30b-a3b:free": { + "id": "qwen/qwen3-30b-a3b:free", + "name": "Qwen3 30B A3B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 40960, "output": 40960 } + }, + "qwen/qwen2.5-vl-72b-instruct": { + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen2.5 VL 72B Instruct", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-02-01", + "last_updated": "2025-02-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "qwen/qwen3-14b:free": { + "id": "qwen/qwen3-14b:free", + "name": "Qwen3 14B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 40960, "output": 40960 } + }, + "qwen/qwen3-30b-a3b-instruct-2507": { + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "family": "qwen3", + "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": true, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 262000, "output": 262000 } + }, + "qwen/qwen3-235b-a22b-thinking-2507": { + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.078, "output": 0.312 }, + "limit": { "context": 262144, "output": 81920 } + }, + "qwen/qwen2.5-vl-32b-instruct:free": { + "id": "qwen/qwen2.5-vl-32b-instruct:free", + "name": "Qwen2.5 VL 32B Instruct (free)", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 8192, "output": 8192 } + }, + "qwen/qwen2.5-vl-72b-instruct:free": { + "id": "qwen/qwen2.5-vl-72b-instruct:free", + "name": "Qwen2.5 VL 72B Instruct (free)", + "family": "qwen2.5-vl", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-02", + "release_date": "2025-02-01", + "last_updated": "2025-02-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "qwen/qwen3-235b-a22b-07-25:free": { + "id": "qwen/qwen3-235b-a22b-07-25:free", + "name": "Qwen3 235B A22B Instruct 2507 (free)", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 131072 } + }, + "qwen/qwen3-coder:free": { + "id": "qwen/qwen3-coder:free", + "name": "Qwen3 Coder 480B A35B Instruct (free)", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 66536 } + }, + "qwen/qwen3-235b-a22b-07-25": { + "id": "qwen/qwen3-235b-a22b-07-25", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0.15, "output": 0.85 }, + "limit": { "context": 262144, "output": 131072 } + }, + "qwen/qwen3-8b:free": { + "id": "qwen/qwen3-8b:free", + "name": "Qwen3 8B (free)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 40960, "output": 40960 } + }, + "qwen/qwen3-max": { + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 262144, "output": 32768 } + }, + "qwen/qwen3-next-80b-a3b-thinking": { + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262144, "output": 262144 } + }, + "qwen/qwen3-coder:exacto": { + "id": "qwen/qwen3-coder:exacto", + "name": "Qwen3 Coder (exacto)", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.38, "output": 1.53 }, + "limit": { "context": 131072, "output": 32768 } + }, + "mistralai/devstral-medium-2507": { + "id": "mistralai/devstral-medium-2507", + "name": "Devstral Medium", + "family": "devstral-medium", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistralai/devstral-2512:free": { + "id": "mistralai/devstral-2512:free", + "name": "Devstral 2 2512 (free)", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-09-12", + "last_updated": "2025-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/devstral-2512": { + "id": "mistralai/devstral-2512", + "name": "Devstral 2 2512", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-09-12", + "last_updated": "2025-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/codestral-2508": { + "id": "mistralai/codestral-2508", + "name": "Codestral 2508", + "family": "codestral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 256000, "output": 256000 } + }, + "mistralai/mistral-7b-instruct:free": { + "id": "mistralai/mistral-7b-instruct:free", + "name": "Mistral 7B Instruct (free)", + "family": "mistral-7b", + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "mistralai/devstral-small-2505": { + "id": "mistralai/devstral-small-2505", + "name": "Devstral Small", + "family": "devstral-small", + "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, + "cost": { "input": 0.06, "output": 0.12 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mistralai/mistral-small-3.2-24b-instruct": { + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral Small 3.2 24B Instruct", + "family": "mistral-small", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 96000, "output": 8192 } + }, + "mistralai/devstral-small-2505:free": { + "id": "mistralai/devstral-small-2505:free", + "name": "Devstral Small 2505 (free)", + "family": "devstral-small", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-05-21", + "last_updated": "2025-05-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "mistralai/mistral-small-3.2-24b-instruct:free": { + "id": "mistralai/mistral-small-3.2-24b-instruct:free", + "name": "Mistral Small 3.2 24B (free)", + "family": "mistral-small", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 96000, "output": 96000 } + }, + "mistralai/mistral-medium-3": { + "id": "mistralai/mistral-medium-3", + "name": "Mistral Medium 3", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistralai/mistral-small-3.1-24b-instruct": { + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral Small 3.1 24B Instruct", + "family": "mistral-small", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "mistralai/devstral-small-2507": { + "id": "mistralai/devstral-small-2507", + "name": "Devstral Small 1.1", + "family": "devstral-small", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 131072, "output": 131072 } + }, + "mistralai/mistral-medium-3.1": { + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral Medium 3.1", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262144, "output": 262144 } + }, + "mistralai/mistral-nemo:free": { + "id": "mistralai/mistral-nemo:free", + "name": "Mistral Nemo (free)", + "family": "mistral-nemo", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-07-19", + "last_updated": "2024-07-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "rekaai/reka-flash-3": { + "id": "rekaai/reka-flash-3", + "name": "Reka Flash 3", + "family": "reka-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, + "meta-llama/llama-3.2-11b-vision-instruct": { + "id": "meta-llama/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11B Vision Instruct", + "family": "llama-3.2", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-3.3-70b-instruct:free": { + "id": "meta-llama/llama-3.3-70b-instruct:free", + "name": "Llama 3.3 70B Instruct (free)", + "family": "llama-3.3", + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 65536, "output": 65536 } + }, + "meta-llama/llama-4-scout:free": { + "id": "meta-llama/llama-4-scout:free", + "name": "Llama 4 Scout (free)", + "family": "llama-4-scout", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 64000, "output": 64000 } + }, + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-haiku-4.5": { + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-opus-4.1": { + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-3.7-sonnet": { + "id": "anthropic/claude-3.7-sonnet", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 128000 } + }, + "anthropic/claude-3.5-haiku": { + "id": "anthropic/claude-3.5-haiku", + "name": "Claude Haiku 3.5", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 3, + "output": 15, + "cache_read": 0.3, + "cache_write": 3.75, + "context_over_200k": { "input": 6, "output": 22.5, "cache_read": 0.6, "cache_write": 7.5 } + }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-opus-4.5": { + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05-30", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-sonnet-4.5": { + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { + "input": 3, + "output": 15, + "cache_read": 0.3, + "cache_write": 3.75, + "context_over_200k": { "input": 6, "output": 22.5, "cache_read": 0.6, "cache_write": 7.5 } + }, + "limit": { "context": 1000000, "output": 64000 } + }, + "sarvamai/sarvam-m:free": { + "id": "sarvamai/sarvam-m:free", + "name": "Sarvam-M (free)", + "family": "sarvam-m", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-05", + "release_date": "2025-05-25", + "last_updated": "2025-05-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + } + } + }, + "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": { + "stepfun/step-3": { + "id": "stepfun/step-3", + "name": "Step-3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.21, "output": 0.57 }, + "limit": { "context": 65536, "output": 64000 } + }, + "moonshotai/kimi-k2-thinking-turbo": { + "id": "moonshotai/kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 64000 } + }, + "moonshotai/kimi-k2-0905": { + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-09", + "last_updated": "2025-09-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262100, "output": 64000 } + }, + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 64000 } + }, + "xiaomi/mimo-v2-flash-free": { + "id": "xiaomi/mimo-v2-flash-free", + "name": "MiMo-V2-Flash Free", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-31", + "last_updated": "2025-12-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 64000 } + }, + "xiaomi/mimo-v2-flash": { + "id": "xiaomi/mimo-v2-flash", + "name": "MiMo-V2-Flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 64000 } + }, + "x-ai/grok-4": { + "id": "x-ai/grok-4", + "name": "Grok 4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-19", + "last_updated": "2025-08-19", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 64000 } + }, + "x-ai/grok-code-fast-1": { + "id": "x-ai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 64000 } + }, + "x-ai/grok-4.1-fast-non-reasoning": { + "id": "x-ai/grok-4.1-fast-non-reasoning", + "name": "Grok 4.1 Fast Non Reasoning", + "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, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 64000 } + }, + "x-ai/grok-4-fast": { + "id": "x-ai/grok-4-fast", + "name": "Grok 4 Fast", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 64000 } + }, + "x-ai/grok-4.1-fast": { + "id": "x-ai/grok-4.1-fast", + "name": "Grok 4.1 Fast", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 64000 } + }, + "deepseek/deepseek-chat": { + "id": "deepseek/deepseek-chat", + "name": "DeepSeek-V3.2 (Non-thinking Mode)", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-10", + "last_updated": "2025-09-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.03 }, + "limit": { "context": 128000, "output": 64000 } + }, + "deepseek/deepseek-v3.2-exp": { + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek-V3.2-Exp", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-26", + "last_updated": "2025-11-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.22, "output": 0.33 }, + "limit": { "context": 163840, "output": 64000 } + }, + "deepseek/deepseek-reasoner": { + "id": "deepseek/deepseek-reasoner", + "name": "DeepSeek-V3.2 (Thinking Mode)", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-23", + "last_updated": "2025-10-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.03 }, + "limit": { "context": 128000, "output": 64000 } + }, + "deepseek/deepseek-v3.2": { + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 0.43 }, + "limit": { "context": 128000, "output": 64000 } + }, + "minimax/minimax-m2": { + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03 }, + "limit": { "context": 204800, "output": 64000 } + }, + "minimax/minimax-m2.1": { + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03 }, + "limit": { "context": 204800, "output": 64000 } + }, + "google/gemini-3-flash-preview": { + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 3, "cache_read": 0.05, "cache_write": 1 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/gemini-3-flash-preview-free": { + "id": "google/gemini-3-flash-preview-free", + "name": "Gemini 3 Flash Preview Free", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/gemini-3-pro-preview": { + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 12, "cache_read": 0.2, "cache_write": 4.5 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/gemini-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", + "modalities": { "input": ["image", "text", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.07, "cache_write": 1 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/gemini-2.5-flash-lite": { + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-14", + "last_updated": "2025-08-14", + "modalities": { "input": ["image", "text", "audio"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03, "cache_write": 1 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31, "cache_write": 4.5 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "volcengine/doubao-seed-code": { + "id": "volcengine/doubao-seed-code", + "name": "Doubao-Seed-Code", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.17, "output": 1.12, "cache_read": 0.03 }, + "limit": { "context": 256000, "output": 64000 } + }, + "volcengine/doubao-seed-1.8": { + "id": "volcengine/doubao-seed-1.8", + "name": "Doubao-Seed-1.8", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.11, "output": 0.28, "cache_read": 0.02, "cache_write": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "openai/gpt-5.1-codex": { + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 64000 } + }, + "openai/gpt-5.1-codex-mini": { + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-Mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 64000 } + }, + "openai/gpt-5.1": { + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 64000 } + }, + "openai/gpt-5-codex": { + "id": "openai/gpt-5-codex", + "name": "GPT-5 Codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-13", + "last_updated": "2025-10-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 64000 } + }, + "openai/gpt-5.1-chat": { + "id": "openai/gpt-5.1-chat", + "name": "GPT-5.1 Chat", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 128000, "output": 64000 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 64000 } + }, + "openai/gpt-5.2": { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.17 }, + "limit": { "context": 400000, "output": 64000 } + }, + "baidu/ernie-5.0-thinking-preview": { + "id": "baidu/ernie-5.0-thinking-preview", + "name": "ERNIE-5.0-Thinking-Preview", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.84, "output": 3.37 }, + "limit": { "context": 128000, "output": 64000 } + }, + "inclusionai/ring-1t": { + "id": "inclusionai/ring-1t", + "name": "Ring-1T", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.56, "output": 2.24, "cache_read": 0.11 }, + "limit": { "context": 128000, "output": 64000 } + }, + "inclusionai/ling-1t": { + "id": "inclusionai/ling-1t", + "name": "Ling-1T", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.56, "output": 2.24, "cache_read": 0.11 }, + "limit": { "context": 128000, "output": 64000 } + }, + "z-ai/glm-4.7": { + "id": "z-ai/glm-4.7", + "name": "GLM 4.7", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.28, "output": 1.14, "cache_read": 0.06 }, + "limit": { "context": 200000, "output": 64000 } + }, + "z-ai/glm-4.6v-flash-free": { + "id": "z-ai/glm-4.6v-flash-free", + "name": "GLM 4.6V Flash (Free)", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-30", + "last_updated": "2025-12-30", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "z-ai/glm-4.6v-flash": { + "id": "z-ai/glm-4.6v-flash", + "name": "GLM 4.6V FlashX", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "z-ai/glm-4.5": { + "id": "z-ai/glm-4.5", + "name": "GLM 4.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-09", + "last_updated": "2025-09-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.35, "output": 1.54, "cache_read": 0.07 }, + "limit": { "context": 128000, "output": 64000 } + }, + "z-ai/glm-4.5-air": { + "id": "z-ai/glm-4.5-air", + "name": "GLM 4.5 Air", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-09", + "last_updated": "2025-09-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.11, "output": 0.56, "cache_read": 0.02 }, + "limit": { "context": 128000, "output": 64000 } + }, + "z-ai/glm-4.6": { + "id": "z-ai/glm-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.35, "output": 1.54, "cache_read": 0.07 }, + "limit": { "context": 200000, "output": 128000 } + }, + "z-ai/glm-4.6v": { + "id": "z-ai/glm-4.6v", + "name": "GLM 4.6V", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.14, "output": 0.42, "cache_read": 0.03 }, + "limit": { "context": 200000, "output": 64000 } + }, + "qwen/qwen3-coder-plus": { + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3-Coder-Plus", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-09-10", + "last_updated": "2025-09-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "kuaishou/kat-coder-pro-v1-free": { + "id": "kuaishou/kat-coder-pro-v1-free", + "name": "KAT-Coder-Pro-V1 Free", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-12-31", + "last_updated": "2025-12-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "kuaishou/kat-coder-pro-v1": { + "id": "kuaishou/kat-coder-pro-v1", + "name": "KAT-Coder-Pro-V1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-10-24", + "last_updated": "2025-10-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-14", + "last_updated": "2025-08-14", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-haiku-4.5": { + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-opus-4.1": { + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "anthropic/claude-opus-4.5": { + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", + "modalities": { "input": ["image", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-sonnet-4.5": { + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 1000000, "output": 64000 } + } + } + }, + "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": { + "mixtral-8x7b-instruct-v0.1": { + "id": "mixtral-8x7b-instruct-v0.1", + "name": "Mixtral-8x7B-Instruct-v0.1", + "family": "mixtral-8x7b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-01", + "last_updated": "2025-04-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 0.7 }, + "limit": { "context": 32000, "output": 32000 } + }, + "mistral-7b-instruct-v0.3": { + "id": "mistral-7b-instruct-v0.3", + "name": "Mistral-7B-Instruct-v0.3", + "family": "mistral-7b", + "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, + "cost": { "input": 0.11, "output": 0.11 }, + "limit": { "context": 127000, "output": 127000 } + }, + "llama-3.1-8b-instruct": { + "id": "llama-3.1-8b-instruct", + "name": "Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-11", + "last_updated": "2025-06-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.11, "output": 0.11 }, + "limit": { "context": 131000, "output": 131000 } + }, + "qwen2.5-vl-72b-instruct": { + "id": "qwen2.5-vl-72b-instruct", + "name": "Qwen2.5-VL-72B-Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 1.01, "output": 1.01 }, + "limit": { "context": 32000, "output": 32000 } + }, + "mistral-nemo-instruct-2407": { + "id": "mistral-nemo-instruct-2407", + "name": "Mistral-Nemo-Instruct-2407", + "family": "mistral-nemo", + "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, + "cost": { "input": 0.14, "output": 0.14 }, + "limit": { "context": 118000, "output": 118000 } + }, + "mistral-small-3.2-24b-instruct-2506": { + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral-Small-3.2-24B-Instruct-2506", + "family": "mistral-small", + "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, + "cost": { "input": 0.1, "output": 0.31 }, + "limit": { "context": 128000, "output": 128000 } + }, + "qwen2.5-coder-32b-instruct": { + "id": "qwen2.5-coder-32b-instruct", + "name": "Qwen2.5-Coder-32B-Instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.96, "output": 0.96 }, + "limit": { "context": 32000, "output": 32000 } + }, + "qwen3-coder-30b-a3b-instruct": { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder-30B-A3B-Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.07, "output": 0.26 }, + "limit": { "context": 256000, "output": 256000 } + }, + "llava-next-mistral-7b": { + "id": "llava-next-mistral-7b", + "name": "llava-next-mistral-7b", + "family": "mistral-7b", + "attachment": true, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-08", + "last_updated": "2025-01-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.32, "output": 0.32 }, + "limit": { "context": 32000, "output": 32000 } + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek-R1-Distill-Llama-70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.74, "output": 0.74 }, + "limit": { "context": 131000, "output": 131000 } + }, + "meta-llama-3_1-70b-instruct": { + "id": "meta-llama-3_1-70b-instruct", + "name": "Meta-Llama-3_1-70B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-01", + "last_updated": "2025-04-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.74, "output": 0.74 }, + "limit": { "context": 131000, "output": 131000 } + }, + "gpt-oss-20b": { + "id": "gpt-oss-20b", + "name": "gpt-oss-20b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.18 }, + "limit": { "context": 131000, "output": 131000 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.47 }, + "limit": { "context": 131000, "output": 131000 } + }, + "meta-llama-3_3-70b-instruct": { + "id": "meta-llama-3_3-70b-instruct", + "name": "Meta-Llama-3_3-70B-Instruct", + "family": "llama-3", + "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, + "cost": { "input": 0.74, "output": 0.74 }, + "limit": { "context": 131000, "output": 131000 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3-32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.09, "output": 0.25 }, + "limit": { "context": 32000, "output": 32000 } + } + } + }, + "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.5-lg": { + "id": "v0-1.5-lg", + "name": "v0-1.5-lg", + "family": "v0", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-09", + "last_updated": "2025-06-09", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 512000, "output": 32000 } + }, + "v0-1.5-md": { + "id": "v0-1.5-md", + "name": "v0-1.5-md", + "family": "v0", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-09", + "last_updated": "2025-06-09", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 128000, "output": 32000 } + }, + "v0-1.0-md": { + "id": "v0-1.0-md", + "name": "v0-1.0-md", + "family": "v0", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 128000, "output": 32000 } + } + } + }, + "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-coder": { + "id": "qwen3-coder", + "name": "Qwen3-Coder-480B-A35B", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "deepseek-v3": { + "id": "deepseek-v3", + "name": "DeepSeek-V3", + "family": "deepseek-v3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32000 } + }, + "kimi-k2": { + "id": "kimi-k2", + "name": "Kimi-K2", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "deepseek-r1": { + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32000 } + }, + "deepseek-v3.1": { + "id": "deepseek-v3.1", + "name": "DeepSeek-V3.1-Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "minimax-m2": { + "id": "minimax-m2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131100 } + }, + "qwen3-235b": { + "id": "qwen3-235b", + "name": "Qwen3-235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32000 } + }, + "deepseek-v3.2-chat": { + "id": "deepseek-v3.2-chat", + "name": "DeepSeek-V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "kimi-k2-0905": { + "id": "kimi-k2-0905", + "name": "Kimi-K2-0905", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi-K2-Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "qwen3-235b-a22b-thinking-2507": { + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3-235B-A22B-Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "qwen3-vl-plus": { + "id": "qwen3-vl-plus", + "name": "Qwen3-VL-Plus", + "family": "qwen3-vl", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 32000 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 128000 } + }, + "tstars2.0": { + "id": "tstars2.0", + "name": "TStars-2.0", + "family": "tstars2.0", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2024-01-01", + "last_updated": "2025-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "qwen3-235b-a22b-instruct": { + "id": "qwen3-235b-a22b-instruct", + "name": "Qwen3-235B-A22B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "qwen3-max": { + "id": "qwen3-max", + "name": "Qwen3-Max", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 32000 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2-Exp", + "family": "deepseek-v3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 64000 } + }, + "qwen3-max-preview": { + "id": "qwen3-max-preview", + "name": "Qwen3-Max-Preview", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 32000 } + }, + "qwen3-coder-plus": { + "id": "qwen3-coder-plus", + "name": "Qwen3-Coder-Plus", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 64000 } + }, + "qwen3-32b": { + "id": "qwen3-32b", + "name": "Qwen3-32B", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32000 } + } + } + }, + "synthetic": { + "id": "synthetic", + "env": ["SYNTHETIC_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.synthetic.new/v1", + "name": "Synthetic", + "doc": "https://synthetic.new/pricing", + "models": { + "hf:Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen 3 235B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 256000, "output": 32000 } + }, + "hf:Qwen/Qwen2.5-Coder-32B-Instruct": { + "id": "hf:Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen2.5-Coder-32B-Instruct", + "family": "qwen2.5-coder", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-11-11", + "last_updated": "2024-11-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.8, "output": 0.8 }, + "limit": { "context": 32768, "output": 32768 } + }, + "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen 3 Coder 480B", + "family": "qwen3-coder", + "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, + "cost": { "input": 2, "output": 2 }, + "limit": { "context": 256000, "output": 32000 } + }, + "hf:Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.65, "output": 3 }, + "limit": { "context": 256000, "output": 32000 } + }, + "hf:MiniMaxAI/MiniMax-M2": { + "id": "hf:MiniMaxAI/MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 196608, "output": 131000 } + }, + "hf:MiniMaxAI/MiniMax-M2.1": { + "id": "hf:MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 204800, "output": 131072 } + }, + "hf:meta-llama/Llama-3.1-70B-Instruct": { + "id": "hf:meta-llama/Llama-3.1-70B-Instruct", + "name": "Llama-3.1-70B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.9, "output": 0.9 }, + "limit": { "context": 128000, "output": 32768 } + }, + "hf:meta-llama/Llama-3.1-8B-Instruct": { + "id": "hf:meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 128000, "output": 32768 } + }, + "hf:meta-llama/Llama-3.3-70B-Instruct": { + "id": "hf:meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.9, "output": 0.9 }, + "limit": { "context": 128000, "output": 32768 } + }, + "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct": { + "id": "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", + "name": "Llama-4-Scout-17B-16E-Instruct", + "family": "llama-4-scout", + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 328000, "output": 4096 } + }, + "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { + "id": "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0.22, "output": 0.88 }, + "limit": { "context": 524000, "output": 4096 } + }, + "hf:meta-llama/Llama-3.1-405B-Instruct": { + "id": "hf:meta-llama/Llama-3.1-405B-Instruct", + "name": "Llama-3.1-405B-Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 3 }, + "limit": { "context": 128000, "output": 32768 } + }, + "hf:moonshotai/Kimi-K2-Instruct-0905": { + "id": "hf:moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 0905", + "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, + "cost": { "input": 1.2, "output": 1.2 }, + "limit": { "context": 262144, "output": 32768 } + }, + "hf:moonshotai/Kimi-K2-Thinking": { + "id": "hf:moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-07", + "last_updated": "2025-11-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 262144, "output": 262144 } + }, + "hf:zai-org/GLM-4.5": { + "id": "hf:zai-org/GLM-4.5", + "name": "GLM 4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 128000, "output": 96000 } + }, + "hf:zai-org/GLM-4.7": { + "id": "hf:zai-org/GLM-4.7", + "name": "GLM 4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 200000, "output": 64000 } + }, + "hf:zai-org/GLM-4.6": { + "id": "hf:zai-org/GLM-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 200000, "output": 64000 } + }, + "hf:deepseek-ai/DeepSeek-R1": { + "id": "hf:deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:deepseek-ai/DeepSeek-R1-0528": { + "id": "hf:deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 (0528)", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 8 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:deepseek-ai/DeepSeek-V3.1-Terminus": { + "id": "hf:deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-09-22", + "last_updated": "2025-09-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 1.2 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:deepseek-ai/DeepSeek-V3.2": { + "id": "hf:deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.4, "cache_read": 0.27, "cache_write": 0 }, + "limit": { "context": 162816, "input": 162816, "output": 8000 } + }, + "hf:deepseek-ai/DeepSeek-V3": { + "id": "hf:deepseek-ai/DeepSeek-V3", + "name": "DeepSeek V3", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 1.25 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:deepseek-ai/DeepSeek-V3.1": { + "id": "hf:deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.56, "output": 1.68 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:deepseek-ai/DeepSeek-V3-0324": { + "id": "hf:deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 (0324)", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 1.2 }, + "limit": { "context": 128000, "output": 128000 } + }, + "hf:openai/gpt-oss-120b": { + "id": "hf:openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 128000, "output": 32768 } + } + } + }, + "deepinfra": { + "id": "deepinfra", + "env": ["DEEPINFRA_API_KEY"], + "npm": "@ai-sdk/deepinfra", + "name": "Deep Infra", + "doc": "https://deepinfra.com/models", + "models": { + "moonshotai/Kimi-K2-Instruct": { + "id": "moonshotai/Kimi-K2-Instruct", + "name": "Kimi K2", + "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, + "cost": { "input": 0.5, "output": 2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-06", + "last_updated": "2025-11-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.47, "output": 2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "MiniMaxAI/MiniMax-M2": { + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMax M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.254, "output": 1.02 }, + "limit": { "context": 262144, "output": 32768 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.03, "output": 0.14 }, + "limit": { "context": 131072, "output": 16384 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.24 }, + "limit": { "context": 131072, "output": 16384 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.4, "output": 1.6 }, + "limit": { "context": 262144, "output": 66536 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "name": "Qwen3 Coder 480B A35B Instruct Turbo", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 262144, "output": 66536 } + }, + "zai-org/GLM-4.5": { + "id": "zai-org/GLM-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "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": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 131072, "output": 98304 }, + "status": "deprecated" + }, + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.43, "output": 1.75, "cache_read": 0.08 }, + "limit": { "context": 202752, "output": 16384 } + } + } + }, + "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-4.6v-flash": { + "id": "glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 128000, "output": 32768 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.5v": { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 1.8 }, + "limit": { "context": 64000, "output": 16384 } + }, + "glm-4.5-air": { + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.1, "cache_read": 0.03, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5": { + "id": "glm-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5-flash": { + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "family": "glm-4.5-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, + "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": { + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0.2, "output": 0.3 }, + "limit": { "context": 262144, "output": 131072 } + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 262144, "output": 262144 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262144, "output": 131072 } + }, + "zai-org/GLM-4.5-FP8": { + "id": "zai-org/GLM-4.5-FP8", + "name": "GLM 4.5 FP8", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 131072, "output": 131072 } + }, + "zai-org/GLM-4.5-Air": { + "id": "zai-org/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "family": "glm-4.5-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, + "cost": { "input": 0.1, "output": 0.5 }, + "limit": { "context": 131072, "output": 131072 } + }, + "deepseek-ai/DeepSeek-R1-0528": { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2.15 }, + "limit": { "context": 75000, "output": 163840 } + }, + "deepseek-ai/DeepSeek-V3.1": { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-23", + "last_updated": "2025-08-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 75000, "output": 163840 } + }, + "deepseek-ai/DeepSeek-V3-0324": { + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "family": "deepseek-v3", + "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, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 75000, "output": 163840 } + } + } + }, + "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": { + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-11-01", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 32768, "output": 8192 } + }, + "moonshotai/kimi-k2-instruct": { + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-07-18", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "nousresearch/hermes-4-405b:thinking": { + "id": "nousresearch/hermes-4-405b:thinking", + "name": "Hermes 4 405b Thinking", + "family": "hermes", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-13", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "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", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-08", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek/deepseek-v3.2:thinking": { + "id": "deepseek/deepseek-v3.2:thinking", + "name": "Deepseek V3.2 Thinking", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek/deepseek-r1": { + "id": "deepseek/deepseek-r1", + "name": "Deepseek R1", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-01-20", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "minimax/minimax-m2.1": { + "id": "minimax/minimax-m2.1", + "name": "Minimax M2.1", + "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-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT Oss 120b", + "family": "gpt", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-06-23", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "z-ai/glm-4.6:thinking": { + "id": "z-ai/glm-4.6:thinking", + "name": "GLM 4.6 Thinking", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-07", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "z-ai/glm-4.6": { + "id": "z-ai/glm-4.6", + "name": "GLM 4.6", + "family": "glm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-11-15", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 200000, "output": 8192 } + }, + "qwen/qwen3-coder": { + "id": "qwen/qwen3-coder", + "name": "Qwen3 Coder", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-01-15", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 106000, "output": 8192 } + }, + "qwen/qwen3-235b-a22b-thinking-2507": { + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-07-01", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 262144, "output": 8192 } + }, + "mistralai/devstral-2-123b-instruct-2512": { + "id": "mistralai/devstral-2-123b-instruct-2512", + "name": "Devstral 2 123b Instruct 2512", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-11", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "mistralai/mistral-large-3-675b-instruct-2512": { + "id": "mistralai/mistral-large-3-675b-instruct-2512", + "name": "Mistral Large 3 675b Instruct 2512", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-12-02", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "mistralai/ministral-14b-instruct-2512": { + "id": "mistralai/ministral-14b-instruct-2512", + "name": "Ministral 14b Instruct 2512", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 131072, "output": 8192 } + }, + "meta-llama/llama-4-maverick": { + "id": "meta-llama/llama-4-maverick", + "name": "Llama 4 Maverick", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta-llama/llama-3.3-70b-instruct": { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70b Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org/glm-4.7": { + "id": "zai-org/glm-4.7", + "name": "GLM 4.7", + "family": "glm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 204800, "output": 8192 } + }, + "zai-org/glm-4.5-air": { + "id": "zai-org/glm-4.5-air", + "name": "GLM 4.5 Air", + "family": "glm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org/glm-4.7:thinking": { + "id": "zai-org/glm-4.7:thinking", + "name": "GLM 4.7 Thinking", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-07", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org/glm-4.5-air:thinking": { + "id": "zai-org/glm-4.5-air:thinking", + "name": "GLM 4.5 Air Thinking", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-07", + "last_updated": "2025-12-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 128000, "output": 8192 } + } + } + }, + "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.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.5-flash": { + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "family": "glm-4.5-flash", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5": { + "id": "glm-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5-air": { + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "family": "glm-4.5-air", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.1, "cache_read": 0.03, "cache_write": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "glm-4.5v": { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "family": "glm-4.5v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 1.8 }, + "limit": { "context": 64000, "output": 16384 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "family": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 128000, "output": 32768 } + } + } + }, + "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": { + "mistral/mistral-nemo-12b-instruct": { + "id": "mistral/mistral-nemo-12b-instruct", + "name": "Mistral Nemo 12B Instruct", + "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, + "cost": { "input": 0.038, "output": 0.1 }, + "limit": { "context": 16000, "output": 4096 } + }, + "google/gemma-3": { + "id": "google/gemma-3", + "name": "Google Gemma 3", + "family": "gemma-3", + "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, + "cost": { "input": 0.15, "output": 0.3 }, + "limit": { "context": 125000, "output": 4096 } + }, + "osmosis/osmosis-structure-0.6b": { + "id": "osmosis/osmosis-structure-0.6b", + "name": "Osmosis Structure 0.6B", + "family": "osmosis-structure-0.6b", + "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, + "cost": { "input": 0.1, "output": 0.5 }, + "limit": { "context": 4000, "output": 2048 } + }, + "qwen/qwen3-embedding-4b": { + "id": "qwen/qwen3-embedding-4b", + "name": "Qwen 3 Embedding 4B", + "family": "qwen3", + "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, + "cost": { "input": 0.01, "output": 0 }, + "limit": { "context": 32000, "output": 2048 } + }, + "qwen/qwen-2.5-7b-vision-instruct": { + "id": "qwen/qwen-2.5-7b-vision-instruct", + "name": "Qwen 2.5 7B Vision Instruct", + "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, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 125000, "output": 4096 } + }, + "meta/llama-3.2-11b-vision-instruct": { + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11B Vision Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.055, "output": 0.055 }, + "limit": { "context": 16000, "output": 4096 } + }, + "meta/llama-3.1-8b-instruct": { + "id": "meta/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.025, "output": 0.025 }, + "limit": { "context": 16000, "output": 4096 } + }, + "meta/llama-3.2-3b-instruct": { + "id": "meta/llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.02, "output": 0.02 }, + "limit": { "context": 16000, "output": 4096 } + }, + "meta/llama-3.2-1b-instruct": { + "id": "meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.01, "output": 0.01 }, + "limit": { "context": 16000, "output": 4096 } + } + } + }, + "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": { + "xai/grok-4": { + "id": "xai/grok-4", + "name": "Grok 4", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-09", + "last_updated": "2025-09-09", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75, "cache_write": 3 }, + "limit": { "context": 256000, "output": 64000 } + }, + "xai/grok-4-fast": { + "id": "xai/grok-4-fast", + "name": "Grok 4 Fast", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05, "cache_write": 0.2 }, + "limit": { "context": 2000000, "output": 64000 } + }, + "google/gemini-3-flash-preview": { + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 0.5, "output": 3, "cache_read": 0.05, "cache_write": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-3-pro-preview": { + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 12, "cache_read": 0.2, "cache_write": 4.5 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.55 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31, "cache_write": 2.375 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "openai/gpt-4.1-mini": { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-5-nano": { + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 16000, "output": 4000 } + }, + "openai/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "o4 Mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5-mini": { + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 128000, "output": 32000 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o Mini", + "family": "gpt-4o-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "audio", "image", "video"], "output": ["text", "audio", "image"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-opus-4-1": { + "id": "anthropic/claude-opus-4-1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "anthropic/claude-haiku-4-5": { + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-02-01", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 62000 } + }, + "anthropic/claude-opus-4-5": { + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-sonnet-4-5": { + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "anthropic/claude-3-7-sonnet": { + "id": "anthropic/claude-3-7-sonnet", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-01", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + } + } + }, + "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", + "family": "morph-v3-large", + "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, + "cost": { "input": 0.9, "output": 1.9 }, + "limit": { "context": 32000, "output": 32000 } + }, + "auto": { + "id": "auto", + "name": "Auto", + "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, + "cost": { "input": 0.85, "output": 1.55 }, + "limit": { "context": 32000, "output": 32000 } + }, + "morph-v3-fast": { + "id": "morph-v3-fast", + "name": "Morph v3 Fast", + "family": "morph-v3-fast", + "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, + "cost": { "input": 0.8, "output": 1.2 }, + "limit": { "context": 16000, "output": 16000 } + } + } + }, + "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": { + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-30b-a3b-2507": { + "id": "qwen/qwen3-30b-a3b-2507", + "name": "Qwen3 30B A3B 2507", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 16384 } + }, + "qwen/qwen3-coder-30b": { + "id": "qwen/qwen3-coder-30b", + "name": "Qwen3 Coder 30B", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 65536 } + } + } + }, + "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": { + "meta-llama-3.3-70b-instruct": { + "id": "meta-llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "family": "llama-3.3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-01", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 0.6 }, + "limit": { "context": 131072, "output": 131072 } + }, + "meta-llama-3.1-8b-instruct": { + "id": "meta-llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama-3.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-01", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 131072, "output": 8000 } + }, + "LGAI-EXAONE/EXAONE-4.0.1-32B": { + "id": "LGAI-EXAONE/EXAONE-4.0.1-32B", + "name": "EXAONE 4.0.1 32B", + "family": "exaone", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-31", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 1 }, + "limit": { "context": 131072, "output": 131072 } + }, + "meta-llama/Llama-4-Maverick-17B-128E-Instruct": { + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct", + "name": "Llama 4 Maverick 17B 128E Instruct", + "family": "llama-4", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-16", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 8000 } + }, + "meta-llama/Llama-4-Scout-17B-16E-Instruct": { + "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "family": "llama-4", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-16", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 8000 } + }, + "Qwen/Qwen3-30B-A3B": { + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen3 30B A3B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-16", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 8000 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-29", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 131072, "output": 131072 } + }, + "Qwen/Qwen3-32B": { + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-16", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 8000 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-29", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 131072 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "family": "glm-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-31", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 131072 } + }, + "deepseek-ai/DeepSeek-R1-0528": { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-11", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 163840, "output": 163840 } + } + } + }, + "sap-ai-core": { + "id": "sap-ai-core", + "env": ["AICORE_SERVICE_KEY"], + "npm": "@mymediset/sap-ai-provider", + "name": "SAP AI Core", + "doc": "https://help.sap.com/docs/sap-ai-core", + "models": { + "anthropic--claude-3.5-sonnet": { + "id": "anthropic--claude-3.5-sonnet", + "name": "anthropic--claude-3.5-sonnet", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic--claude-4.5-haiku": { + "id": "anthropic--claude-4.5-haiku", + "name": "anthropic--claude-4.5-haiku", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-02-28", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic--claude-4-opus": { + "id": "anthropic--claude-4-opus", + "name": "anthropic--claude-4-opus", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "anthropic--claude-3-haiku": { + "id": "anthropic--claude-3-haiku", + "name": "anthropic--claude-3-haiku", + "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, + "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic--claude-3-sonnet": { + "id": "anthropic--claude-3-sonnet", + "name": "anthropic--claude-3-sonnet", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "gpt-5-nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 400000, "output": 128000 } + }, + "anthropic--claude-3.7-sonnet": { + "id": "anthropic--claude-3.7-sonnet", + "name": "anthropic--claude-3.7-sonnet", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 128000 } + }, + "anthropic--claude-4.5-sonnet": { + "id": "anthropic--claude-4.5-sonnet", + "name": "anthropic--claude-4.5-sonnet", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "anthropic--claude-3-opus": { + "id": "anthropic--claude-3-opus", + "name": "anthropic--claude-3-opus", + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 4096 } + }, + "anthropic--claude-4-sonnet": { + "id": "anthropic--claude-4-sonnet", + "name": "anthropic--claude-4-sonnet", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "gpt-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + } + } + }, + "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-opus-4-0": { + "id": "claude-opus-4-0", + "name": "Claude Opus 4 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "claude-3-5-sonnet-20241022": { + "id": "claude-3-5-sonnet-20241022", + "name": "Claude Sonnet 3.5 v2", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-5-sonnet-20240620": { + "id": "claude-3-5-sonnet-20240620", + "name": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04-30", + "release_date": "2024-06-20", + "last_updated": "2024-06-20", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-3-5-haiku-latest": { + "id": "claude-3-5-haiku-latest", + "name": "Claude Haiku 3.5 (latest)", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-opus-20240229": { + "id": "claude-3-opus-20240229", + "name": "Claude Opus 3", + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 4096 } + }, + "claude-opus-4-5-20251101": { + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-11-01", + "last_updated": "2025-11-01", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-sonnet-4-5-20250929": { + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-sonnet-4-20250514": { + "id": "claude-sonnet-4-20250514", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4-20250514": { + "id": "claude-opus-4-20250514", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "claude-3-5-haiku-20241022": { + "id": "claude-3-5-haiku-20241022", + "name": "Claude Haiku 3.5", + "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, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "claude-3-haiku-20240307": { + "id": "claude-3-haiku-20240307", + "name": "Claude Haiku 3", + "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, + "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "claude-3-7-sonnet-20250219": { + "id": "claude-3-7-sonnet-20250219", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-3-7-sonnet-latest": { + "id": "claude-3-7-sonnet-latest", + "name": "Claude Sonnet 3.7 (latest)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-sonnet-4-0": { + "id": "claude-sonnet-4-0", + "name": "Claude Sonnet 4 (latest)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4-1-20250805": { + "id": "claude-opus-4-1-20250805", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "claude-3-sonnet-20240229": { + "id": "claude-3-sonnet-20240229", + "name": "Claude Sonnet 3", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 0.3 }, + "limit": { "context": 200000, "output": 4096 } + }, + "claude-haiku-4-5-20251001": { + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + } + } + }, + "aihubmix": { + "id": "aihubmix", + "env": ["AIHUBMIX_API_KEY"], + "npm": "@aihubmix/ai-sdk-provider", + "name": "AIHubMix", + "doc": "https://docs.aihubmix.com", + "models": { + "gpt-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "family": "gpt-4.1-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, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "glm-4.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm-4.7", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1.1, "cache_read": 0.548 }, + "limit": { "context": 204800, "output": 131072 } + }, + "qwen3-235b-a22b-instruct-2507": { + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0.28, "output": 1.12 }, + "limit": { "context": 262144, "output": 262144 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 16.5, "output": 82.5, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-15", + "last_updated": "2025-11-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 5.5, "cache_read": 0.11, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 12, "cache_read": 0.5 }, + "limit": { "context": 1000000, "output": 65000 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.075, "output": 0.3, "cache_read": 0.02 }, + "limit": { "context": 1000000, "output": 65000 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3.3, "output": 16.5, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "coding-glm-4.7-free": { + "id": "coding-glm-4.7-free", + "name": "Coding GLM-4.7 Free", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "family": "gpt-5-codex-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-15", + "last_updated": "2025-11-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 128000 } + }, + "qwen3-235b-a22b-thinking-2507": { + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 2.8 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-11", + "release_date": "2025-11-15", + "last_updated": "2025-11-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5-Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": false, + "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, + "cost": { "input": 0.5, "output": 2, "cache_read": 0.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-09", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.75 }, + "limit": { "context": 200000, "output": 65536 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5-Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 5, "cache_read": 0.31 }, + "limit": { "context": 2000000, "output": 65000 } + }, + "gpt-4o-2024-11-20": { + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-Max", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "minimax-m2.1-free": { + "id": "minimax-m2.1-free", + "name": "MiniMax M2.1 Free", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.82, "output": 3.29 }, + "limit": { "context": 262144, "output": 131000 } + }, + "deepseek-v3.2-think": { + "id": "deepseek-v3.2-think", + "name": "DeepSeek-V3.2-Think", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 0.45 }, + "limit": { "context": 131000, "output": 64000 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 20, "cache_read": 2.5 }, + "limit": { "context": 400000, "output": 128000 } + }, + "minimax-m2.1": { + "id": "minimax-m2.1", + "name": "MiniMax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.29, "output": 1.15 }, + "limit": { "context": 204800, "output": 131072 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 0.45 }, + "limit": { "context": 131000, "output": 64000 } + }, + "Kimi-K2-0905": { + "id": "Kimi-K2-0905", + "name": "Kimi K2 0905", + "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, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "GPT-5-Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 7, "output": 28, "cache_read": 3.5 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + } + } + }, + "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/models/deepseek-r1-0528": { + "id": "accounts/fireworks/models/deepseek-r1-0528", + "name": "Deepseek R1 05/28", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 8 }, + "limit": { "context": 160000, "output": 16384 } + }, + "accounts/fireworks/models/deepseek-v3p1": { + "id": "accounts/fireworks/models/deepseek-v3p1", + "name": "DeepSeek V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.56, "output": 1.68 }, + "limit": { "context": 163840, "output": 163840 } + }, + "accounts/fireworks/models/deepseek-v3p2": { + "id": "accounts/fireworks/models/deepseek-v3p2", + "name": "DeepSeek V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.56, "output": 1.68, "cache_read": 0.28 }, + "limit": { "context": 160000, "output": 160000 } + }, + "accounts/fireworks/models/minimax-m2": { + "id": "accounts/fireworks/models/minimax-m2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.15 }, + "limit": { "context": 192000, "output": 192000 } + }, + "accounts/fireworks/models/minimax-m2p1": { + "id": "accounts/fireworks/models/minimax-m2p1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.15 }, + "limit": { "context": 200000, "output": 200000 } + }, + "accounts/fireworks/models/glm-4p7": { + "id": "accounts/fireworks/models/glm-4p7", + "name": "GLM 4.7", + "family": "glm-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.3 }, + "limit": { "context": 198000, "output": 198000 } + }, + "accounts/fireworks/models/deepseek-v3-0324": { + "id": "accounts/fireworks/models/deepseek-v3-0324", + "name": "Deepseek V3 03-24", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.9, "output": 0.9 }, + "limit": { "context": 160000, "output": 16384 } + }, + "accounts/fireworks/models/glm-4p6": { + "id": "accounts/fireworks/models/glm-4p6", + "name": "GLM 4.6", + "family": "glm-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-10-01", + "last_updated": "2025-10-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.19, "cache_read": 0.28 }, + "limit": { "context": 198000, "output": 198000 } + }, + "accounts/fireworks/models/kimi-k2-thinking": { + "id": "accounts/fireworks/models/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 256000, "output": 256000 } + }, + "accounts/fireworks/models/kimi-k2-instruct": { + "id": "accounts/fireworks/models/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "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, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 128000, "output": 16384 } + }, + "accounts/fireworks/models/qwen3-235b-a22b": { + "id": "accounts/fireworks/models/qwen3-235b-a22b", + "name": "Qwen3 235B-A22B", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.22, "output": 0.88 }, + "limit": { "context": 128000, "output": 16384 } + }, + "accounts/fireworks/models/gpt-oss-20b": { + "id": "accounts/fireworks/models/gpt-oss-20b", + "name": "GPT OSS 20B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.2 }, + "limit": { "context": 131072, "output": 32768 } + }, + "accounts/fireworks/models/gpt-oss-120b": { + "id": "accounts/fireworks/models/gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 131072, "output": 32768 } + }, + "accounts/fireworks/models/glm-4p5-air": { + "id": "accounts/fireworks/models/glm-4p5-air", + "name": "GLM 4.5 Air", + "family": "glm-4-air", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-08-01", + "last_updated": "2025-08-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.22, "output": 0.88 }, + "limit": { "context": 131072, "output": 131072 } + }, + "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct": { + "id": "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "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": true, + "cost": { "input": 0.45, "output": 1.8 }, + "limit": { "context": 256000, "output": 32768 } + }, + "accounts/fireworks/models/glm-4p5": { + "id": "accounts/fireworks/models/glm-4p5", + "name": "GLM 4.5", + "family": "glm-4", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 131072, "output": 131072 } + } + } + }, + "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": { + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct", + "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, + "cost": { "input": 0.39, "output": 1.9, "cache_read": 0.195, "cache_write": 0.78 }, + "limit": { "context": 32768, "output": 4096 } + }, + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.55, "output": 2.25, "cache_read": 0.275, "cache_write": 1.1 }, + "limit": { "context": 32768, "output": 4096 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "GPT-OSS 20B", + "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, + "cost": { "input": 0.03, "output": 0.14, "cache_read": 0.015, "cache_write": 0.06 }, + "limit": { "context": 64000, "output": 4096 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "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, + "cost": { "input": 0.04, "output": 0.4, "cache_read": 0.02, "cache_write": 0.08 }, + "limit": { "context": 131072, "output": 4096 } + }, + "mistralai/Devstral-Small-2505": { + "id": "mistralai/Devstral-Small-2505", + "name": "Devstral Small 2505", + "family": "devstral-small", + "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, + "cost": { "input": 0.05, "output": 0.22, "cache_read": 0.025, "cache_write": 0.1 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/Mistral-Nemo-Instruct-2407": { + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "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, + "cost": { "input": 0.02, "output": 0.04, "cache_read": 0.01, "cache_write": 0.04 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/Magistral-Small-2506": { + "id": "mistralai/Magistral-Small-2506", + "name": "Magistral Small 2506", + "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, + "cost": { "input": 0.5, "output": 1.5, "cache_read": 0.25, "cache_write": 1 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistralai/Mistral-Large-Instruct-2411": { + "id": "mistralai/Mistral-Large-Instruct-2411", + "name": "Mistral Large Instruct 2411", + "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, + "cost": { "input": 2, "output": 6, "cache_read": 1, "cache_write": 4 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama/Llama-3.3-70B-Instruct": { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0.13, "output": 0.38, "cache_read": 0.065, "cache_write": 0.26 }, + "limit": { "context": 128000, "output": 4096 } + }, + "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", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.075, "cache_write": 0.3 }, + "limit": { "context": 430000, "output": 4096 } + }, + "meta-llama/Llama-3.2-90B-Vision-Instruct": { + "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "name": "Llama 3.2 90B Vision Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.35, "output": 0.4, "cache_read": 0.175, "cache_write": 0.7 }, + "limit": { "context": 16000, "output": 4096 } + }, + "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar": { + "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "name": "Qwen 3 Coder 480B", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.22, "output": 0.95, "cache_read": 0.11, "cache_write": 0.44 }, + "limit": { "context": 106000, "output": 4096 } + }, + "Qwen/Qwen2.5-VL-32B-Instruct": { + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen 2.5 VL 32B Instruct", + "family": "qwen2.5-vl", + "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, + "cost": { "input": 0.05, "output": 0.22, "cache_read": 0.025, "cache_write": 0.1 }, + "limit": { "context": 32000, "output": 4096 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen 3 235B Thinking", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.11, "output": 0.6, "cache_read": 0.055, "cache_write": 0.22 }, + "limit": { "context": 262144, "output": 4096 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen 3 Next 80B Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.1, "output": 0.8, "cache_read": 0.05, "cache_write": 0.2 }, + "limit": { "context": 262144, "output": 4096 } + }, + "zai-org/GLM-4.6": { + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "family": "glm-4.6", + "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, + "cost": { "input": 0.4, "output": 1.75, "cache_read": 0.2, "cache_write": 0.8 }, + "limit": { "context": 200000, "output": 4096 } + }, + "deepseek-ai/DeepSeek-R1-0528": { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8.75, "cache_read": 1, "cache_write": 4 }, + "limit": { "context": 128000, "output": 4096 } + } + } + }, + "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": { + "ZhipuAI/GLM-4.5": { + "id": "ZhipuAI/GLM-4.5", + "name": "GLM-4.5", + "family": "glm-4.5", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 98304 } + }, + "ZhipuAI/GLM-4.6": { + "id": "ZhipuAI/GLM-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 202752, "output": 98304 } + }, + "Qwen/Qwen3-30B-A3B-Thinking-2507": { + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 32768 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 131072 } + }, + "Qwen/Qwen3-Coder-30B-A3B-Instruct": { + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 65536 } + }, + "Qwen/Qwen3-30B-A3B-Instruct-2507": { + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "family": "qwen3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 16384 } + }, + "Qwen/Qwen3-235B-A22B-Thinking-2507": { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 131072 } + } + } + }, + "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-3.5-turbo-1106": { + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 1, "output": 2 }, + "limit": { "context": 16384, "output": 16384 } + }, + "mistral-small-2503": { + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "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, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 32768 } + }, + "codestral-2501": { + "id": "codestral-2501", + "name": "Codestral 25.01", + "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, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 256000, "output": 256000 } + }, + "mistral-large-2411": { + "id": "mistral-large-2411", + "name": "Mistral Large 24.11", + "family": "mistral-large", + "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"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 6 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "limit": { "context": 128000, "output": 128000 } + }, + "mai-ds-r1": { + "id": "mai-ds-r1", + "name": "MAI-DS-R1", + "family": "mai-ds-r1", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 272000, "output": 128000 } + }, + "gpt-4o-mini": { + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "family": "gpt-4o-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, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.08 }, + "limit": { "context": 128000, "output": 16384 } + }, + "phi-4-reasoning-plus": { + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 32000, "output": 4096 } + }, + "gpt-4-turbo-vision": { + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "phi-4-reasoning": { + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 32000, "output": 4096 } + }, + "phi-3-medium-4k-instruct": { + "id": "phi-3-medium-4k-instruct", + "name": "Phi-3-medium-instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.17, "output": 0.68 }, + "limit": { "context": 4096, "output": 1024 } + }, + "codex-mini": { + "id": "codex-mini", + "name": "Codex Mini", + "family": "codex", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.375 }, + "limit": { "context": 200000, "output": 100000 } + }, + "o3": { + "id": "o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "mistral-nemo": { + "id": "mistral-nemo", + "name": "Mistral Nemo", + "family": "mistral-nemo", + "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"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gpt-3.5-turbo-instruct": { + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 4096, "output": 4096 } + }, + "meta-llama-3.1-8b-instruct": { + "id": "meta-llama-3.1-8b-instruct", + "name": "Meta-Llama-3.1-8B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.3, "output": 0.61 }, + "limit": { "context": 128000, "output": 32768 } + }, + "text-embedding-ada-002": { + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "family": "text-embedding-ada", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "cohere-embed-v3-english": { + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 512, "output": 1024 } + }, + "llama-4-scout-17b-16e-instruct": { + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "family": "llama-4-scout", + "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, + "cost": { "input": 0.2, "output": 0.78 }, + "limit": { "context": 128000, "output": 8192 } + }, + "o1-mini": { + "id": "o1-mini", + "name": "o1-mini", + "family": "o1-mini", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 128000, "output": 65536 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 272000, "output": 128000 } + }, + "phi-3.5-moe-instruct": { + "id": "phi-3.5-moe-instruct", + "name": "Phi-3.5-MoE-instruct", + "family": "phi-3.5", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.16, "output": 0.64 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-5.1-chat": { + "id": "gpt-5.1-chat", + "name": "GPT-5.1 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 128000, "output": 16384 } + }, + "grok-3-mini": { + "id": "grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "o1": { + "id": "o1", + "name": "o1", + "family": "o1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 60, "cache_read": 7.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "meta-llama-3-8b-instruct": { + "id": "meta-llama-3-8b-instruct", + "name": "Meta-Llama-3-8B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.61 }, + "limit": { "context": 8192, "output": 2048 } + }, + "phi-4-multimodal": { + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "family": "phi-4", + "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, + "cost": { "input": 0.08, "output": 0.32, "input_audio": 4 }, + "limit": { "context": 128000, "output": 4096 } + }, + "o4-mini": { + "id": "o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.28 }, + "limit": { "context": 200000, "output": 100000 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 8, "cache_read": 0.5 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "ministral-3b": { + "id": "ministral-3b", + "name": "Ministral 3B", + "family": "ministral-3b", + "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, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-3.5-turbo-0301": { + "id": "gpt-3.5-turbo-0301", + "name": "GPT-3.5 Turbo 0301", + "family": "gpt-3.5-turbo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-08", + "release_date": "2023-03-01", + "last_updated": "2023-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 4096, "output": 4096 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, + "limit": { "context": 128000, "output": 16384 } + }, + "phi-3-mini-128k-instruct": { + "id": "phi-3-mini-128k-instruct", + "name": "Phi-3-mini-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 128000, "output": 4096 } + }, + "llama-3.2-90b-vision-instruct": { + "id": "llama-3.2-90b-vision-instruct", + "name": "Llama-3.2-90B-Vision-Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 2.04, "output": 2.04 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-5-codex": { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 272000, "output": 128000 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 272000, "output": 128000 } + }, + "o3-mini": { + "id": "o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.1, "output": 4.4, "cache_read": 0.55 }, + "limit": { "context": 200000, "output": 100000 } + }, + "model-router": { + "id": "model-router", + "name": "Model Router", + "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, + "cost": { "input": 0.14, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-k2", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5.1-codex-mini": { + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "family": "gpt-5-codex-mini", + "attachment": false, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "output": 128000 } + }, + "llama-3.3-70b-instruct": { + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0.71, "output": 0.71 }, + "limit": { "context": 128000, "output": 32768 } + }, + "o1-preview": { + "id": "o1-preview", + "name": "o1-preview", + "family": "o1-preview", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2023-09", + "release_date": "2024-09-12", + "last_updated": "2024-09-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 16.5, "output": 66, "cache_read": 8.25 }, + "limit": { "context": 128000, "output": 32768 } + }, + "phi-3.5-mini-instruct": { + "id": "phi-3.5-mini-instruct", + "name": "Phi-3.5-mini-instruct", + "family": "phi-3.5", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-08-20", + "last_updated": "2024-08-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 128000, "output": 4096 } + }, + "gpt-3.5-turbo-0613": { + "id": "gpt-3.5-turbo-0613", + "name": "GPT-3.5 Turbo 0613", + "family": "gpt-3.5-turbo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-08", + "release_date": "2023-06-13", + "last_updated": "2023-06-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 4 }, + "limit": { "context": 16384, "output": 16384 } + }, + "gpt-4-turbo": { + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 10, "output": 30 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama-3.1-70b-instruct": { + "id": "meta-llama-3.1-70b-instruct", + "name": "Meta-Llama-3.1-70B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 2.68, "output": 3.54 }, + "limit": { "context": 128000, "output": 32768 } + }, + "phi-3-small-8k-instruct": { + "id": "phi-3-small-8k-instruct", + "name": "Phi-3-small-instruct (8k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 8192, "output": 2048 } + }, + "deepseek-v3-0324": { + "id": "deepseek-v3-0324", + "name": "DeepSeek-V3-0324", + "family": "deepseek-v3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.14, "output": 4.56 }, + "limit": { "context": 131072, "output": 131072 } + }, + "meta-llama-3-70b-instruct": { + "id": "meta-llama-3-70b-instruct", + "name": "Meta-Llama-3-70B-Instruct", + "family": "llama-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-04-18", + "last_updated": "2024-04-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2.68, "output": 3.54 }, + "limit": { "context": 8192, "output": 2048 } + }, + "text-embedding-3-large": { + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "family": "text-embedding-3-large", + "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, + "cost": { "input": 0.13, "output": 0 }, + "limit": { "context": 8191, "output": 3072 } + }, + "grok-3": { + "id": "grok-3", + "name": "Grok 3", + "family": "grok-3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "gpt-3.5-turbo-0125": { + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 16384, "output": 16384 } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "phi-4-mini-reasoning": { + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "family": "phi-4", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 128000, "output": 4096 } + }, + "phi-4": { + "id": "phi-4", + "name": "Phi-4", + "family": "phi-4", + "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, + "cost": { "input": 0.125, "output": 0.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "deepseek-v3.1": { + "id": "deepseek-v3.1", + "name": "DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.56, "output": 1.68 }, + "limit": { "context": 131072, "output": 131072 } + }, + "gpt-5-chat": { + "id": "gpt-5-chat", + "name": "GPT-5 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": false, + "knowledge": "2024-10-24", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "family": "gpt-4.1-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "llama-4-maverick-17b-128e-instruct-fp8": { + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "cohere-command-r-plus-08-2024": { + "id": "cohere-command-r-plus-08-2024", + "name": "Command R+", + "family": "command-r-plus", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 4000 } + }, + "cohere-command-a": { + "id": "cohere-command-a", + "name": "Command A", + "family": "command-a", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 256000, "output": 8000 } + }, + "phi-3-small-128k-instruct": { + "id": "phi-3-small-128k-instruct", + "name": "Phi-3-small-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "mistral-medium-2505": { + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "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, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 128000, "output": 128000 } + }, + "deepseek-v3.2-speciale": { + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.28, "output": 0.42 }, + "limit": { "context": 128000, "output": 128000 } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-02-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "phi-3-mini-4k-instruct": { + "id": "phi-3-mini-4k-instruct", + "name": "Phi-3-mini-instruct (4k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.52 }, + "limit": { "context": 4096, "output": 1024 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-5-codex", + "attachment": false, + "reasoning": true, + "tool_call": 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, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 10000 } + }, + "deepseek-r1": { + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 163840, "output": 163840 } + }, + "meta-llama-3.1-405b-instruct": { + "id": "meta-llama-3.1-405b-instruct", + "name": "Meta-Llama-3.1-405B-Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 5.33, "output": 16 }, + "limit": { "context": 128000, "output": 32768 } + }, + "gpt-4-32k": { + "id": "gpt-4-32k", + "name": "GPT-4 32K", + "family": "gpt-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-11", + "release_date": "2023-03-14", + "last_updated": "2023-03-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 60, "output": 120 }, + "limit": { "context": 32768, "output": 32768 } + }, + "phi-4-mini": { + "id": "phi-4-mini", + "name": "Phi-4-mini", + "family": "phi-4", + "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, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere-embed-v3-multilingual": { + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "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, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 512, "output": 1024 } + }, + "grok-4": { + "id": "grok-4", + "name": "Grok 4", + "family": "grok", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "reasoning": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 64000 } + }, + "cohere-command-r-08-2024": { + "id": "cohere-command-r-08-2024", + "name": "Command R", + "family": "command-r", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4000 } + }, + "cohere-embed-v-4-0": { + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "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, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 128000, "output": 1536 } + }, + "llama-3.2-11b-vision-instruct": { + "id": "llama-3.2-11b-vision-instruct", + "name": "Llama-3.2-11B-Vision-Instruct", + "family": "llama-3.2", + "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, + "cost": { "input": 0.37, "output": 0.37 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gpt-5.2-chat": { + "id": "gpt-5.2-chat", + "name": "GPT-5.2 Chat", + "family": "gpt-5-chat", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 128000, "output": 16384 } + }, + "claude-opus-4-1": { + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 }, + "provider": { "npm": "@ai-sdk/anthropic" } + }, + "gpt-4": { + "id": "gpt-4", + "name": "GPT-4", + "family": "gpt-4", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-11", + "release_date": "2023-03-14", + "last_updated": "2023-03-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 60, "output": 120 }, + "limit": { "context": 8192, "output": 8192 } + }, + "phi-3-medium-128k-instruct": { + "id": "phi-3-medium-128k-instruct", + "name": "Phi-3-medium-instruct (128k)", + "family": "phi-3", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2024-04-23", + "last_updated": "2024-04-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.17, "output": 0.68 }, + "limit": { "context": 128000, "output": 4096 } + }, + "grok-4-fast-reasoning": { + "id": "grok-4-fast-reasoning", + "name": "Grok 4 Fast (Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "deepseek-r1-0528": { + "id": "deepseek-r1-0528", + "name": "DeepSeek-R1-0528", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 163840, "output": 163840 } + }, + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "text-embedding-3-small": { + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "family": "text-embedding-3-small", + "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, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8191, "output": 1536 } + }, + "gpt-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "family": "gpt-4.1-nano", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-05", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.03 }, + "limit": { "context": 1047576, "output": 32768 } + } + } + }, + "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": { + "llama-3.3-8b-instruct": { + "id": "llama-3.3-8b-instruct", + "name": "Llama-3.3-8B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "llama-4-maverick-17b-128e-instruct-fp8": { + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "llama-3.3-70b-instruct": { + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "llama-4-scout-17b-16e-instruct-fp8": { + "id": "llama-4-scout-17b-16e-instruct-fp8", + "name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "family": "llama-4-scout", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "groq-llama-4-maverick-17b-128e-instruct": { + "id": "groq-llama-4-maverick-17b-128e-instruct", + "name": "Groq-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cerebras-llama-4-scout-17b-16e-instruct": { + "id": "cerebras-llama-4-scout-17b-16e-instruct", + "name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", + "family": "llama-4-scout", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cerebras-llama-4-maverick-17b-128e-instruct": { + "id": "cerebras-llama-4-maverick-17b-128e-instruct", + "name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", + "family": "llama-4-maverick", + "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, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 4096 } + } + } + }, + "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": { + "qwen3-235b-a22b-instruct-2507": { + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen3", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.75, "output": 2.25 }, + "limit": { "context": 260000, "output": 8192 } + }, + "pixtral-12b-2409": { + "id": "pixtral-12b-2409", + "name": "Pixtral 12B 2409", + "family": "pixtral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 128000, "output": 4096 } + }, + "llama-3.1-8b-instruct": { + "id": "llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama-3.1", + "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, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 128000, "output": 16384 } + }, + "mistral-nemo-instruct-2407": { + "id": "mistral-nemo-instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "family": "mistral-nemo", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-25", + "last_updated": "2024-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "mistral-small-3.2-24b-instruct-2506": { + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral Small 3.2 24B Instruct (2506)", + "family": "mistral-small", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.35 }, + "limit": { "context": 128000, "output": 8192 } + }, + "qwen3-coder-30b-a3b-instruct": { + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "family": "qwen3-coder", + "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, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 128000, "output": 8192 } + }, + "llama-3.3-70b-instruct": { + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "family": "llama-3.3", + "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, + "cost": { "input": 0.9, "output": 0.9 }, + "limit": { "context": 100000, "output": 4096 } + }, + "whisper-large-v3": { + "id": "whisper-large-v3", + "name": "Whisper Large v3", + "family": "whisper-large", + "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, + "cost": { "input": 0.003, "output": 0 }, + "limit": { "context": 0, "output": 4096 } + }, + "deepseek-r1-distill-llama-70b": { + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "family": "deepseek-r1-distill-llama", + "attachment": false, + "reasoning": true, + "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": true, + "cost": { "input": 0.9, "output": 0.9 }, + "limit": { "context": 32000, "output": 4096 } + }, + "voxtral-small-24b-2507": { + "id": "voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "family": "voxtral-small", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", + "modalities": { "input": ["text", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.35 }, + "limit": { "context": 32000, "output": 8192 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "GPT-OSS 120B", + "family": "gpt-oss", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 8192 } + }, + "bge-multilingual-gemma2": { + "id": "bge-multilingual-gemma2", + "name": "BGE Multilingual Gemma2", + "family": "gemma-2", + "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, + "cost": { "input": 0.13, "output": 0 }, + "limit": { "context": 8191, "output": 3072 } + }, + "gemma-3-27b-it": { + "id": "gemma-3-27b-it", + "name": "Gemma-3-27B-IT", + "family": "gemma-3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2024-12-01", + "last_updated": "2025-09-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 0.5 }, + "limit": { "context": 40000, "output": 8192 } + } + } + }, + "amazon-bedrock": { + "id": "amazon-bedrock", + "env": ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION"], + "npm": "@ai-sdk/amazon-bedrock", + "name": "Amazon Bedrock", + "doc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "models": { + "cohere.command-r-plus-v1:0": { + "id": "cohere.command-r-plus-v1:0", + "name": "Command R+", + "family": "command-r-plus", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-04-04", + "last_updated": "2024-04-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 128000, "output": 4096 } + }, + "anthropic.claude-v2": { + "id": "anthropic.claude-v2", + "name": "Claude 2", + "family": "claude", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2023-07-11", + "last_updated": "2023-07-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 8, "output": 24 }, + "limit": { "context": 100000, "output": 4096 } + }, + "anthropic.claude-3-7-sonnet-20250219-v1:0": { + "id": "anthropic.claude-3-7-sonnet-20250219-v1:0", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic.claude-sonnet-4-20250514-v1:0": { + "id": "anthropic.claude-sonnet-4-20250514-v1:0", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "qwen.qwen3-coder-30b-a3b-v1:0": { + "id": "qwen.qwen3-coder-30b-a3b-v1:0", + "name": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 262144, "output": 131072 } + }, + "google.gemma-3-4b-it": { + "id": "google.gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "family": "gemma-3", + "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, + "cost": { "input": 0.04, "output": 0.08 }, + "limit": { "context": 128000, "output": 4096 } + }, + "minimax.minimax-m2": { + "id": "minimax.minimax-m2", + "name": "MiniMax M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 204608, "output": 128000 } + }, + "meta.llama3-2-11b-instruct-v1:0": { + "id": "meta.llama3-2-11b-instruct-v1:0", + "name": "Llama 3.2 11B Instruct", + "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, + "cost": { "input": 0.16, "output": 0.16 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen.qwen3-next-80b-a3b": { + "id": "qwen.qwen3-next-80b-a3b", + "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "family": "qwen3", + "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, + "cost": { "input": 0.14, "output": 1.4 }, + "limit": { "context": 262000, "output": 262000 } + }, + "anthropic.claude-3-haiku-20240307-v1:0": { + "id": "anthropic.claude-3-haiku-20240307-v1:0", + "name": "Claude Haiku 3", + "family": "claude-haiku", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-02", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1.25 }, + "limit": { "context": 200000, "output": 4096 } + }, + "meta.llama3-2-90b-instruct-v1:0": { + "id": "meta.llama3-2-90b-instruct-v1:0", + "name": "Llama 3.2 90B Instruct", + "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, + "cost": { "input": 0.72, "output": 0.72 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen.qwen3-vl-235b-a22b": { + "id": "qwen.qwen3-vl-235b-a22b", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "family": "qwen3-vl", + "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, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "meta.llama3-2-1b-instruct-v1:0": { + "id": "meta.llama3-2-1b-instruct-v1:0", + "name": "Llama 3.2 1B Instruct", + "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"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 131000, "output": 4096 } + }, + "anthropic.claude-v2:1": { + "id": "anthropic.claude-v2:1", + "name": "Claude 2.1", + "family": "claude", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2023-11-21", + "last_updated": "2023-11-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 8, "output": 24 }, + "limit": { "context": 200000, "output": 4096 } + }, + "deepseek.v3-v1:0": { + "id": "deepseek.v3-v1:0", + "name": "DeepSeek-V3.1", + "family": "deepseek-v3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.58, "output": 1.68 }, + "limit": { "context": 163840, "output": 81920 } + }, + "anthropic.claude-opus-4-5-20251101-v1:0": { + "id": "anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "cohere.command-light-text-v14": { + "id": "cohere.command-light-text-v14", + "name": "Command Light", + "family": "command-light", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2023-11-01", + "last_updated": "2023-11-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.6 }, + "limit": { "context": 4096, "output": 4096 } + }, + "mistral.mistral-large-2402-v1:0": { + "id": "mistral.mistral-large-2402-v1:0", + "name": "Mistral Large (24.02)", + "family": "mistral-large", + "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, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google.gemma-3-27b-it": { + "id": "google.gemma-3-27b-it", + "name": "Google Gemma 3 27B Instruct", + "family": "gemma-3", + "attachment": true, + "reasoning": false, + "tool_call": 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, + "cost": { "input": 0.12, "output": 0.2 }, + "limit": { "context": 202752, "output": 8192 } + }, + "nvidia.nemotron-nano-12b-v2": { + "id": "nvidia.nemotron-nano-12b-v2", + "name": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "family": "nemotron", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "google.gemma-3-12b-it": { + "id": "google.gemma-3-12b-it", + "name": "Google Gemma 3 12B", + "family": "gemma-3", + "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, + "cost": { "input": 0.049999999999999996, "output": 0.09999999999999999 }, + "limit": { "context": 131072, "output": 8192 } + }, + "ai21.jamba-1-5-large-v1:0": { + "id": "ai21.jamba-1-5-large-v1:0", + "name": "Jamba 1.5 Large", + "family": "jamba-1.5-large", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-15", + "last_updated": "2024-08-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 256000, "output": 4096 } + }, + "meta.llama3-3-70b-instruct-v1:0": { + "id": "meta.llama3-3-70b-instruct-v1:0", + "name": "Llama 3.3 70B Instruct", + "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, + "cost": { "input": 0.72, "output": 0.72 }, + "limit": { "context": 128000, "output": 4096 } + }, + "anthropic.claude-3-opus-20240229-v1:0": { + "id": "anthropic.claude-3-opus-20240229-v1:0", + "name": "Claude Opus 3", + "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", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 200000, "output": 4096 } + }, + "amazon.nova-pro-v1:0": { + "id": "amazon.nova-pro-v1:0", + "name": "Nova Pro", + "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, + "cost": { "input": 0.8, "output": 3.2, "cache_read": 0.2 }, + "limit": { "context": 300000, "output": 8192 } + }, + "meta.llama3-1-8b-instruct-v1:0": { + "id": "meta.llama3-1-8b-instruct-v1:0", + "name": "Llama 3.1 8B Instruct", + "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, + "cost": { "input": 0.22, "output": 0.22 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai.gpt-oss-120b-1:0": { + "id": "openai.gpt-oss-120b-1:0", + "name": "gpt-oss-120b", + "family": "openai.gpt-oss", + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen.qwen3-32b-v1:0": { + "id": "qwen.qwen3-32b-v1:0", + "name": "Qwen3 32B (dense)", + "family": "qwen3", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 16384, "output": 16384 } + }, + "anthropic.claude-3-5-sonnet-20240620-v1:0": { + "id": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "name": "Claude Sonnet 3.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-06-20", + "last_updated": "2024-06-20", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "anthropic.claude-haiku-4-5-20251001-v1:0": { + "id": "anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "cohere.command-r-v1:0": { + "id": "cohere.command-r-v1:0", + "name": "Command R", + "family": "command-r", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-03-11", + "last_updated": "2024-03-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "mistral.voxtral-small-24b-2507": { + "id": "mistral.voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "family": "mistral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", + "modalities": { "input": ["text", "audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.35 }, + "limit": { "context": 32000, "output": 8192 } + }, + "amazon.nova-micro-v1:0": { + "id": "amazon.nova-micro-v1:0", + "name": "Nova Micro", + "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, + "cost": { "input": 0.035, "output": 0.14, "cache_read": 0.00875 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta.llama3-1-70b-instruct-v1:0": { + "id": "meta.llama3-1-70b-instruct-v1:0", + "name": "Llama 3.1 70B Instruct", + "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, + "cost": { "input": 0.72, "output": 0.72 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta.llama3-70b-instruct-v1:0": { + "id": "meta.llama3-70b-instruct-v1:0", + "name": "Llama 3 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2.65, "output": 3.5 }, + "limit": { "context": 8192, "output": 2048 } + }, + "deepseek.r1-v1:0": { + "id": "deepseek.r1-v1:0", + "name": "DeepSeek-R1", + "family": "deepseek-r1", + "attachment": false, + "reasoning": true, + "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, + "cost": { "input": 1.35, "output": 5.4 }, + "limit": { "context": 128000, "output": 32768 } + }, + "anthropic.claude-3-5-sonnet-20241022-v2:0": { + "id": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "name": "Claude Sonnet 3.5 v2", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 8192 } + }, + "mistral.ministral-3-8b-instruct": { + "id": "mistral.ministral-3-8b-instruct", + "name": "Ministral 3 8B", + "family": "ministral", + "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, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 4096 } + }, + "cohere.command-text-v14": { + "id": "cohere.command-text-v14", + "name": "Command", + "family": "command", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2023-11-01", + "last_updated": "2023-11-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 4096, "output": 4096 } + }, + "anthropic.claude-opus-4-20250514-v1:0": { + "id": "anthropic.claude-opus-4-20250514-v1:0", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "mistral.voxtral-mini-3b-2507": { + "id": "mistral.voxtral-mini-3b-2507", + "name": "Voxtral Mini 3B 2507", + "family": "mistral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "modalities": { "input": ["audio", "text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 128000, "output": 4096 } + }, + "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)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "amazon.nova-2-lite-v1:0": { + "id": "amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite", + "family": "nova", + "attachment": false, + "reasoning": false, + "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, + "cost": { "input": 0.33, "output": 2.75 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen.qwen3-coder-480b-a35b-v1:0": { + "id": "qwen.qwen3-coder-480b-a35b-v1:0", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen3-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.22, "output": 1.8 }, + "limit": { "context": 131072, "output": 65536 } + }, + "anthropic.claude-sonnet-4-5-20250929-v1:0": { + "id": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "openai.gpt-oss-safeguard-20b": { + "id": "openai.gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "family": "openai.gpt-oss-safeguard", + "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, + "cost": { "input": 0.07, "output": 0.2 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai.gpt-oss-20b-1:0": { + "id": "openai.gpt-oss-20b-1:0", + "name": "gpt-oss-20b", + "family": "openai.gpt-oss", + "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, + "cost": { "input": 0.07, "output": 0.3 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta.llama3-2-3b-instruct-v1:0": { + "id": "meta.llama3-2-3b-instruct-v1:0", + "name": "Llama 3.2 3B Instruct", + "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"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 131000, "output": 4096 } + }, + "anthropic.claude-instant-v1": { + "id": "anthropic.claude-instant-v1", + "name": "Claude Instant", + "family": "claude", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2023-03-01", + "last_updated": "2023-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.8, "output": 2.4 }, + "limit": { "context": 100000, "output": 4096 } + }, + "amazon.nova-premier-v1:0": { + "id": "amazon.nova-premier-v1:0", + "name": "Nova Premier", + "family": "nova", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.5, "output": 12.5 }, + "limit": { "context": 1000000, "output": 16384 } + }, + "mistral.mistral-7b-instruct-v0:2": { + "id": "mistral.mistral-7b-instruct-v0:2", + "name": "Mistral-7B-Instruct-v0.3", + "family": "mistral-7b", + "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, + "cost": { "input": 0.11, "output": 0.11 }, + "limit": { "context": 127000, "output": 127000 } + }, + "mistral.mixtral-8x7b-instruct-v0:1": { + "id": "mistral.mixtral-8x7b-instruct-v0:1", + "name": "Mixtral-8x7B-Instruct-v0.1", + "family": "mixtral-8x7b", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-01", + "last_updated": "2025-04-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 0.7 }, + "limit": { "context": 32000, "output": 32000 } + }, + "anthropic.claude-opus-4-1-20250805-v1:0": { + "id": "anthropic.claude-opus-4-1-20250805-v1:0", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "meta.llama4-scout-17b-instruct-v1:0": { + "id": "meta.llama4-scout-17b-instruct-v1:0", + "name": "Llama 4 Scout 17B Instruct", + "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, + "cost": { "input": 0.17, "output": 0.66 }, + "limit": { "context": 3500000, "output": 16384 } + }, + "ai21.jamba-1-5-mini-v1:0": { + "id": "ai21.jamba-1-5-mini-v1:0", + "name": "Jamba 1.5 Mini", + "family": "jamba-1.5-mini", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2024-08-15", + "last_updated": "2024-08-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.4 }, + "limit": { "context": 256000, "output": 4096 } + }, + "meta.llama3-8b-instruct-v1:0": { + "id": "meta.llama3-8b-instruct-v1:0", + "name": "Llama 3 8B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-03", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.6 }, + "limit": { "context": 8192, "output": 2048 } + }, + "amazon.titan-text-express-v1:0:8k": { + "id": "amazon.titan-text-express-v1:0:8k", + "name": "Titan Text G1 - Express", + "family": "titan-text-express", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "anthropic.claude-3-sonnet-20240229-v1:0": { + "id": "anthropic.claude-3-sonnet-20240229-v1:0", + "name": "Claude Sonnet 3", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-08", + "release_date": "2024-03-04", + "last_updated": "2024-03-04", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 4096 } + }, + "nvidia.nemotron-nano-9b-v2": { + "id": "nvidia.nemotron-nano-9b-v2", + "name": "NVIDIA Nemotron Nano 9B v2", + "family": "nemotron", + "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, + "cost": { "input": 0.06, "output": 0.23 }, + "limit": { "context": 128000, "output": 4096 } + }, + "amazon.titan-text-express-v1": { + "id": "amazon.titan-text-express-v1", + "name": "Titan Text G1 - Express", + "family": "titan-text-express", + "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, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta.llama4-maverick-17b-instruct-v1:0": { + "id": "meta.llama4-maverick-17b-instruct-v1:0", + "name": "Llama 4 Maverick 17B Instruct", + "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, + "cost": { "input": 0.24, "output": 0.97 }, + "limit": { "context": 1000000, "output": 16384 } + }, + "mistral.ministral-3-14b-instruct": { + "id": "mistral.ministral-3-14b-instruct", + "name": "Ministral 14B 3.0", + "family": "ministral", + "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, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai.gpt-oss-safeguard-120b": { + "id": "openai.gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "family": "openai.gpt-oss-safeguard", + "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, + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 128000, "output": 4096 } + }, + "qwen.qwen3-235b-a22b-2507-v1:0": { + "id": "qwen.qwen3-235b-a22b-2507-v1:0", + "name": "Qwen3 235B A22B 2507", + "family": "qwen3", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-18", + "last_updated": "2025-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.22, "output": 0.88 }, + "limit": { "context": 262144, "output": 131072 } + }, + "amazon.nova-lite-v1:0": { + "id": "amazon.nova-lite-v1:0", + "name": "Nova Lite", + "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, + "cost": { "input": 0.06, "output": 0.24, "cache_read": 0.015 }, + "limit": { "context": 300000, "output": 8192 } + }, + "anthropic.claude-3-5-haiku-20241022-v1:0": { + "id": "anthropic.claude-3-5-haiku-20241022-v1:0", + "name": "Claude Haiku 3.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.8, "output": 4, "cache_read": 0.08, "cache_write": 1 }, + "limit": { "context": 200000, "output": 8192 } + }, + "moonshot.kimi-k2-thinking": { + "id": "moonshot.kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 256000, "output": 256000 } + } + } + }, + "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": { + "xai/grok-4-fast-non-reasoning": { + "id": "xai/grok-4-fast-non-reasoning", + "name": "Grok-4-Fast-Non-Reasoning", + "family": "grok-4", + "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, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 128000 } + }, + "xai/grok-4-fast-reasoning": { + "id": "xai/grok-4-fast-reasoning", + "name": "Grok 4 Fast Reasoning", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-09-16", + "last_updated": "2025-09-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 128000 } + }, + "xai/grok-4.1-fast-reasoning": { + "id": "xai/grok-4.1-fast-reasoning", + "name": "Grok-4.1-Fast-Reasoning", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "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": { + "id": "xai/grok-4", + "name": "Grok 4", + "family": "grok-4", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-07-10", + "last_updated": "2025-07-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 256000, "output": 128000 } + }, + "xai/grok-code-fast-1": { + "id": "xai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-08-22", + "last_updated": "2025-08-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 1.5, "cache_read": 0.02 }, + "limit": { "context": 256000, "output": 128000 } + }, + "xai/grok-4.1-fast-non-reasoning": { + "id": "xai/grok-4.1-fast-non-reasoning", + "name": "Grok-4.1-Fast-Non-Reasoning", + "family": "grok-4", + "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": { + "id": "xai/grok-3", + "name": "Grok 3", + "family": "grok-3", + "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, + "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, + "limit": { "context": 131072, "output": 8192 } + }, + "xai/grok-3-mini": { + "id": "xai/grok-3-mini", + "name": "Grok 3 Mini", + "family": "grok-3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-04-11", + "last_updated": "2025-04-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.5, "cache_read": 0.075 }, + "limit": { "context": 131072, "output": 8192 } + }, + "ideogramai/ideogram": { + "id": "ideogramai/ideogram", + "name": "Ideogram", + "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": { + "id": "ideogramai/ideogram-v2a", + "name": "Ideogram-v2a", + "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-v2a-turbo": { + "id": "ideogramai/ideogram-v2a-turbo", + "name": "Ideogram-v2a-Turbo", + "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-v2": { + "id": "ideogramai/ideogram-v2", + "name": "Ideogram-v2", + "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 } + }, + "runwayml/runway": { + "id": "runwayml/runway", + "name": "Runway", + "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 } + }, + "runwayml/runway-gen-4-turbo": { + "id": "runwayml/runway-gen-4-turbo", + "name": "Runway-Gen-4-Turbo", + "family": "runway-gen-4-turbo", + "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 } + }, + "poetools/claude-code": { + "id": "poetools/claude-code", + "name": "claude-code", + "attachment": true, + "reasoning": true, + "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 } + }, + "elevenlabs/elevenlabs-v3": { + "id": "elevenlabs/elevenlabs-v3", + "name": "ElevenLabs-v3", + "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", + "family": "elevenlabs-music", + "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 } + }, + "elevenlabs/elevenlabs-v2.5-turbo": { + "id": "elevenlabs/elevenlabs-v2.5-turbo", + "name": "ElevenLabs-v2.5-Turbo", + "family": "elevenlabs-v2.5-turbo", + "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 } + }, + "google/gemini-deep-research": { + "id": "google/gemini-deep-research", + "name": "gemini-deep-research", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.6, "output": 9.6 }, + "limit": { "context": 1048576, "output": 0 } + }, + "google/nano-banana": { + "id": "google/nano-banana", + "name": "Nano-Banana", + "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, + "cost": { "input": 0.21, "output": 1.8, "cache_read": 0.021 }, + "limit": { "context": 32768, "output": 0 } + }, + "google/imagen-4": { + "id": "google/imagen-4", + "name": "Imagen-4", + "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/imagen-3": { + "id": "google/imagen-3", + "name": "Imagen-3", + "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/imagen-4-ultra": { + "id": "google/imagen-4-ultra", + "name": "Imagen-4-Ultra", + "family": "imagen-4-ultra", + "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-2.5-flash": { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.21, "output": 1.8, "cache_read": 0.021 }, + "limit": { "context": 1065535, "output": 65535 } + }, + "google/gemini-2.0-flash-lite": { + "id": "google/gemini-2.0-flash-lite", + "name": "Gemini-2.0-Flash-Lite", + "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, + "cost": { "input": 0.052, "output": 0.21 }, + "limit": { "context": 990000, "output": 8192 } + }, + "google/gemini-3-pro": { + "id": "google/gemini-3-pro", + "name": "Gemini-3-Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 1.6, "output": 9.6, "cache_read": 0.16 }, + "limit": { "context": 1048576, "output": 64000 } + }, + "google/veo-3.1": { + "id": "google/veo-3.1", + "name": "Veo-3.1", + "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/imagen-3-fast": { + "id": "google/imagen-3-fast", + "name": "Imagen-3-Fast", + "family": "imagen-3-fast", + "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/lyria": { + "id": "google/lyria", + "name": "Lyria", + "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 } + }, + "google/gemini-2.0-flash": { + "id": "google/gemini-2.0-flash", + "name": "Gemini-2.0-Flash", + "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, + "cost": { "input": 0.1, "output": 0.42 }, + "limit": { "context": 990000, "output": 8192 } + }, + "google/gemini-2.5-flash-lite": { + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 1024000, "output": 64000 } + }, + "google/veo-3": { + "id": "google/veo-3", + "name": "Veo-3", + "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/veo-3-fast": { + "id": "google/veo-3-fast", + "name": "Veo-3-Fast", + "family": "veo-3-fast", + "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/imagen-4-fast": { + "id": "google/imagen-4-fast", + "name": "Imagen-4-Fast", + "family": "imagen-4-fast", + "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/veo-2": { + "id": "google/veo-2", + "name": "Veo-2", + "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/gemini-3-flash": { + "id": "google/gemini-3-flash", + "name": "gemini-3-flash", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.4, "output": 2.4, "cache_read": 0.04 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "google/nano-banana-pro": { + "id": "google/nano-banana-pro", + "name": "Nano-Banana-Pro", + "family": "nano-banana-pro", + "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, + "cost": { "input": 1.7, "output": 10, "cache_read": 0.17 }, + "limit": { "context": 65536, "output": 0 } + }, + "google/gemini-2.5-pro": { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.87, "output": 7, "cache_read": 0.087 }, + "limit": { "context": 1065535, "output": 65535 } + }, + "google/veo-3.1-fast": { + "id": "google/veo-3.1-fast", + "name": "Veo-3.1-Fast", + "family": "veo-3.1-fast", + "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 } + }, + "openai/gpt-4.1-nano": { + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1-nano", + "family": "gpt-4.1-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, + "cost": { "input": 0.09, "output": 0.36, "cache_read": 0.022 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-5.2-instant": { + "id": "openai/gpt-5.2-instant", + "name": "gpt-5.2-instant", + "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, + "cost": { "input": 1.6, "output": 13, "cache_read": 0.16 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/sora-2": { + "id": "openai/sora-2", + "name": "Sora-2", + "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/o1-pro": { + "id": "openai/o1-pro", + "name": "o1-pro", + "family": "o1-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-03-19", + "last_updated": "2025-03-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 140, "output": 540 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5.1-codex": { + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-3.5-turbo-raw": { + "id": "openai/gpt-3.5-turbo-raw", + "name": "GPT-3.5-Turbo-Raw", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.45, "output": 1.4 }, + "limit": { "context": 4524, "output": 2048 } + }, + "openai/gpt-4-classic": { + "id": "openai/gpt-4-classic", + "name": "GPT-4-Classic", + "family": "gpt-4", + "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, + "cost": { "input": 27, "output": 54 }, + "limit": { "context": 8192, "output": 4096 } + }, + "openai/gpt-4.1-mini": { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1-mini", + "family": "gpt-4.1-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, + "cost": { "input": 0.36, "output": 1.4, "cache_read": 0.09 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/gpt-5-chat": { + "id": "openai/gpt-5-chat", + "name": "GPT-5-Chat", + "family": "gpt-5-chat", + "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, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o3-deep-research": { + "id": "openai/o3-deep-research", + "name": "o3-deep-research", + "family": "o3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 9, "output": 36, "cache_read": 2.2 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4o-search": { + "id": "openai/gpt-4o-search", + "name": "GPT-4o-Search", + "family": "gpt-4o", + "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, + "cost": { "input": 2.2, "output": 9 }, + "limit": { "context": 128000, "output": 8192 } + }, + "openai/gpt-image-1.5": { + "id": "openai/gpt-image-1.5", + "name": "gpt-image-1.5", + "attachment": true, + "reasoning": false, + "tool_call": true, + "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-image-1-mini": { + "id": "openai/gpt-image-1-mini", + "name": "GPT-Image-1-Mini", + "family": "gpt-image", + "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-3.5-turbo": { + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-Turbo", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 0.45, "output": 1.4 }, + "limit": { "context": 16384, "output": 2048 } + }, + "openai/gpt-5.2-pro": { + "id": "openai/gpt-5.2-pro", + "name": "gpt-5.2-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 19, "output": 150 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/o3-mini-high": { + "id": "openai/o3-mini-high", + "name": "o3-mini-high", + "family": "o3-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.99, "output": 4 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/chatgpt-4o-latest": { + "id": "openai/chatgpt-4o-latest", + "name": "ChatGPT-4o-Latest", + "family": "chatgpt-4o", + "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, + "cost": { "input": 4.5, "output": 14 }, + "limit": { "context": 128000, "output": 8192 } + }, + "openai/gpt-4-turbo": { + "id": "openai/gpt-4-turbo", + "name": "GPT-4-Turbo", + "family": "gpt-4-turbo", + "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, + "cost": { "input": 9, "output": 27 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai/gpt-5.1-codex-mini": { + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-Mini", + "family": "gpt-5-codex-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.22, "output": 1.8, "cache_read": 0.022 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.1-instant": { + "id": "openai/gpt-5.1-instant", + "name": "GPT-5.1-Instant", + "family": "gpt-5", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o3-mini": { + "id": "openai/o3-mini", + "name": "o3-mini", + "family": "o3-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-01-31", + "last_updated": "2025-01-31", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.99, "output": 4 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5.1": { + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-nano": { + "id": "openai/gpt-5-nano", + "name": "GPT-5-nano", + "family": "gpt-5-nano", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.045, "output": 0.36, "cache_read": 0.0045 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-codex": { + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "family": "gpt-5-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4o": { + "id": "openai/gpt-4o", + "name": "GPT-4o", + "family": "gpt-4o", + "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/gpt-4.1": { + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "family": "gpt-4.1", + "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, + "cost": { "input": 1.8, "output": 7.2, "cache_read": 0.45 }, + "limit": { "context": 1047576, "output": 32768 } + }, + "openai/o4-mini": { + "id": "openai/o4-mini", + "name": "o4-mini", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.99, "output": 4, "cache_read": 0.25 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o1": { + "id": "openai/o1", + "name": "o1", + "family": "o1", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2024-12-18", + "last_updated": "2024-12-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 14, "output": 54 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5-mini": { + "id": "openai/gpt-5-mini", + "name": "GPT-5-mini", + "family": "gpt-5-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-25", + "last_updated": "2025-06-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.22, "output": 1.8, "cache_read": 0.022 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4o-aug": { + "id": "openai/gpt-4o-aug", + "name": "GPT-4o-Aug", + "family": "gpt-4o", + "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, + "cost": { "input": 2.2, "output": 9, "cache_read": 1.1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "openai/o3-pro": { + "id": "openai/o3-pro", + "name": "o3-pro", + "family": "o3-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-10", + "last_updated": "2025-06-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 18, "output": 72 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-image-1": { + "id": "openai/gpt-image-1", + "name": "GPT-Image-1", + "family": "gpt-image", + "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-5.1-codex-max": { + "id": "openai/gpt-5.1-codex-max", + "name": "gpt-5.1-codex-max", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-3.5-turbo-instruct": { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "GPT-3.5-Turbo-Instruct", + "family": "gpt-3.5-turbo", + "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, + "cost": { "input": 1.4, "output": 1.8 }, + "limit": { "context": 3500, "output": 1024 } + }, + "openai/o3": { + "id": "openai/o3", + "name": "o3", + "family": "o3", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.8, "output": 7.2, "cache_read": 0.45 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/o4-mini-deep-research": { + "id": "openai/o4-mini-deep-research", + "name": "o4-mini-deep-research", + "family": "o4-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.8, "output": 7.2, "cache_read": 0.45 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-4-classic-0314": { + "id": "openai/gpt-4-classic-0314", + "name": "GPT-4-Classic-0314", + "family": "gpt-4", + "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, + "cost": { "input": 27, "output": 54 }, + "limit": { "context": 8192, "output": 4096 } + }, + "openai/gpt-4o-mini": { + "id": "openai/gpt-4o-mini", + "name": "GPT-4o-mini", + "family": "gpt-4o-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, + "cost": { "input": 0.14, "output": 0.54, "cache_read": 0.068 }, + "limit": { "context": 128000, "output": 4096 } + }, + "openai/gpt-5": { + "id": "openai/gpt-5", + "name": "GPT-5", + "family": "gpt-5", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/dall-e-3": { + "id": "openai/dall-e-3", + "name": "DALL-E-3", + "family": "dall-e-3", + "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/sora-2-pro": { + "id": "openai/sora-2-pro", + "name": "Sora-2-Pro", + "family": "sora-2-pro", + "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-pro": { + "id": "openai/gpt-5-pro", + "name": "GPT-5-Pro", + "family": "gpt-5-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 14, "output": 110 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.2": { + "id": "openai/gpt-5.2", + "name": "gpt-5.2", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.6, "output": 13, "cache_read": 0.16 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-4o-mini-search": { + "id": "openai/gpt-4o-mini-search", + "name": "GPT-4o-mini-Search", + "family": "gpt-4o-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, + "cost": { "input": 0.14, "output": 0.54 }, + "limit": { "context": 128000, "output": 8192 } + }, + "stabilityai/stablediffusionxl": { + "id": "stabilityai/stablediffusionxl", + "name": "StableDiffusionXL", + "family": "stablediffusionxl", + "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 } + }, + "topazlabs-co/topazlabs": { + "id": "topazlabs-co/topazlabs", + "name": "TopazLabs", + "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 } + }, + "lumalabs/ray2": { + "id": "lumalabs/ray2", + "name": "Ray2", + "family": "ray2", + "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 } + }, + "lumalabs/dream-machine": { + "id": "lumalabs/dream-machine", + "name": "Dream-Machine", + "family": "dream-machine", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": false, + "release_date": "2024-09-18", + "last_updated": "2024-09-18", + "modalities": { "input": ["text", "image"], "output": ["video"] }, + "open_weights": false, + "limit": { "context": 5000, "output": 0 } + }, + "anthropic/claude-opus-3": { + "id": "anthropic/claude-opus-3", + "name": "Claude-Opus-3", + "family": "claude-opus", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": false, + "release_date": "2024-03-04", + "last_updated": "2024-03-04", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 13, "output": 64, "cache_read": 1.3, "cache_write": 16 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", + "name": "Claude Opus 4", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 13, "output": 64, "cache_read": 1.3, "cache_write": 16 }, + "limit": { "context": 192512, "output": 32768 } + }, + "anthropic/claude-sonnet-3.7-reasoning": { + "id": "anthropic/claude-sonnet-3.7-reasoning", + "name": "Claude Sonnet 3.7 Reasoning", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 196608, "output": 128000 } + }, + "anthropic/claude-opus-4-search": { + "id": "anthropic/claude-opus-4-search", + "name": "Claude Opus 4 Search", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 13, "output": 64, "cache_read": 1.3, "cache_write": 16 }, + "limit": { "context": 196608, "output": 128000 } + }, + "anthropic/claude-sonnet-3.7": { + "id": "anthropic/claude-sonnet-3.7", + "name": "Claude Sonnet 3.7", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 196608, "output": 32768 } + }, + "anthropic/claude-haiku-3.5-search": { + "id": "anthropic/claude-haiku-3.5-search", + "name": "Claude-Haiku-3.5-Search", + "family": "claude-haiku", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": false, + "release_date": "2025-05-15", + "last_updated": "2025-05-15", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.68, "output": 3.4, "cache_read": 0.068, "cache_write": 0.85 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-haiku-4.5": { + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 0.85, "output": 4.3, "cache_read": 0.085, "cache_write": 1.1 }, + "limit": { "context": 192000, "output": 64000 } + }, + "anthropic/claude-sonnet-4-reasoning": { + "id": "anthropic/claude-sonnet-4-reasoning", + "name": "Claude Sonnet 4 Reasoning", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 983040, "output": 64000 } + }, + "anthropic/claude-haiku-3": { + "id": "anthropic/claude-haiku-3", + "name": "Claude-Haiku-3", + "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, + "cost": { "input": 0.21, "output": 1.1, "cache_read": 0.021, "cache_write": 0.26 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-opus-4.1": { + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 13, "output": 64, "cache_read": 1.3, "cache_write": 16 }, + "limit": { "context": 196608, "output": 32000 } + }, + "anthropic/claude-sonnet-3.7-search": { + "id": "anthropic/claude-sonnet-3.7-search", + "name": "Claude Sonnet 3.7 Search", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-05-15", + "last_updated": "2025-05-15", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 196608, "output": 128000 } + }, + "anthropic/claude-opus-4-reasoning": { + "id": "anthropic/claude-opus-4-reasoning", + "name": "Claude Opus 4 Reasoning", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 13, "output": 64, "cache_read": 1.3, "cache_write": 16 }, + "limit": { "context": 196608, "output": 32768 } + }, + "anthropic/claude-sonnet-3.5": { + "id": "anthropic/claude-sonnet-3.5", + "name": "Claude-Sonnet-3.5", + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 983040, "output": 32768 } + }, + "anthropic/claude-opus-4.5": { + "id": "anthropic/claude-opus-4.5", + "name": "claude-opus-4.5", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 4.3, "output": 21, "cache_read": 0.43, "cache_write": 5.3 }, + "limit": { "context": 196608, "output": 64000 } + }, + "anthropic/claude-haiku-3.5": { + "id": "anthropic/claude-haiku-3.5", + "name": "Claude-Haiku-3.5", + "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, + "cost": { "input": 0.68, "output": 3.4, "cache_read": 0.068, "cache_write": 0.85 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-sonnet-3.5-june": { + "id": "anthropic/claude-sonnet-3.5-june", + "name": "Claude-Sonnet-3.5-June", + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 189096, "output": 8192 } + }, + "anthropic/claude-sonnet-4.5": { + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "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, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 983040, "output": 32768 } + }, + "anthropic/claude-sonnet-4-search": { + "id": "anthropic/claude-sonnet-4-search", + "name": "Claude Sonnet 4 Search", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.6, "output": 13, "cache_read": 0.26, "cache_write": 3.2 }, + "limit": { "context": 983040, "output": 128000 } + }, + "trytako/tako": { + "id": "trytako/tako", + "name": "Tako", + "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 } + }, + "novita/glm-4.7": { + "id": "novita/glm-4.7", + "name": "glm-4.7", + "attachment": true, + "reasoning": true, + "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 } + }, + "novita/kimi-k2-thinking": { + "id": "novita/kimi-k2-thinking", + "name": "kimi-k2-thinking", + "family": "kimi-k2", + "attachment": true, + "reasoning": true, + "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/kat-coder-pro": { + "id": "novita/kat-coder-pro", + "name": "kat-coder-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 256000, "output": 0 } + }, + "novita/glm-4.6": { + "id": "novita/glm-4.6", + "name": "GLM-4.6", + "family": "glm-4.6", + "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/minimax-m2.1": { + "id": "novita/minimax-m2.1", + "name": "minimax-m2.1", + "attachment": true, + "reasoning": true, + "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.6v": { + "id": "novita/glm-4.6v", + "name": "glm-4.6v", + "attachment": true, + "reasoning": true, + "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 } + }, + "cerebras/gpt-oss-120b-cs": { + "id": "cerebras/gpt-oss-120b-cs", + "name": "gpt-oss-120b-cs", + "attachment": true, + "reasoning": true, + "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 } + }, + "cerebras/zai-glm-4.6-cs": { + "id": "cerebras/zai-glm-4.6-cs", + "name": "zai-glm-4.6-cs", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "release_date": "2025-11-11", + "last_updated": "2025-11-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 131000, "output": 40000 } + } + } + }, + "cerebras": { + "id": "cerebras", + "env": ["CEREBRAS_API_KEY"], + "npm": "@ai-sdk/cerebras", + "name": "Cerebras", + "doc": "https://inference-docs.cerebras.ai/models/overview", + "models": { + "zai-glm-4.7": { + "id": "zai-glm-4.7", + "name": "Z.AI GLM-4.7", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2026-01-10", + "last_updated": "2026-01-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 40000 } + }, + "qwen-3-235b-a22b-instruct-2507": { + "id": "qwen-3-235b-a22b-instruct-2507", + "name": "Qwen 3 235B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 1.2 }, + "limit": { "context": 131000, "output": 32000 } + }, + "zai-glm-4.6": { + "id": "zai-glm-4.6", + "name": "Z.AI GLM-4.6", + "family": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-11-05", + "last_updated": "2025-11-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 131072, "output": 40960 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.25, "output": 0.69 }, + "limit": { "context": 131072, "output": 32768 } + } + } + } +} diff --git a/packages/opencode/test/session/truncation.test.ts b/packages/opencode/test/session/truncation.test.ts new file mode 100644 index 000000000000..a3891ed450dd --- /dev/null +++ b/packages/opencode/test/session/truncation.test.ts @@ -0,0 +1,79 @@ +import { describe, test, expect } from "bun:test" +import { Truncate } from "../../src/session/truncation" +import path from "path" + +const FIXTURES_DIR = path.join(import.meta.dir, "fixtures") + +describe("Truncate", () => { + describe("output", () => { + test("truncates large json file by bytes", async () => { + const content = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text() + const result = Truncate.output(content) + + expect(result.truncated).toBe(true) + expect(Buffer.byteLength(result.content, "utf-8")).toBeLessThanOrEqual(Truncate.MAX_BYTES + 100) + expect(result.content).toContain("truncated...") + }) + + test("returns content unchanged when under limits", () => { + const content = "line1\nline2\nline3" + const result = Truncate.output(content) + + expect(result.truncated).toBe(false) + expect(result.content).toBe(content) + }) + + test("truncates by line count", () => { + const lines = Array.from({ length: 100 }, (_, i) => `line${i}`).join("\n") + const result = Truncate.output(lines, { maxLines: 10 }) + + expect(result.truncated).toBe(true) + expect(result.content.split("\n").length).toBeLessThanOrEqual(12) + expect(result.content).toContain("...90 lines truncated...") + }) + + test("truncates by byte count", () => { + const content = "a".repeat(1000) + const result = Truncate.output(content, { maxBytes: 100 }) + + expect(result.truncated).toBe(true) + expect(result.content).toContain("truncated...") + }) + + test("truncates from head by default", () => { + const lines = Array.from({ length: 10 }, (_, i) => `line${i}`).join("\n") + const result = Truncate.output(lines, { maxLines: 3 }) + + expect(result.truncated).toBe(true) + expect(result.content).toContain("line0") + expect(result.content).toContain("line1") + expect(result.content).toContain("line2") + expect(result.content).not.toContain("line9") + }) + + test("truncates from tail when direction is tail", () => { + const lines = Array.from({ length: 10 }, (_, i) => `line${i}`).join("\n") + const result = Truncate.output(lines, { maxLines: 3, direction: "tail" }) + + expect(result.truncated).toBe(true) + expect(result.content).toContain("line7") + expect(result.content).toContain("line8") + expect(result.content).toContain("line9") + expect(result.content).not.toContain("line0") + }) + + test("uses default MAX_LINES and MAX_BYTES", () => { + expect(Truncate.MAX_LINES).toBe(2000) + expect(Truncate.MAX_BYTES).toBe(50 * 1024) + }) + + test("large single-line file truncates with byte message", async () => { + const content = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text() + const result = Truncate.output(content) + + expect(result.truncated).toBe(true) + expect(result.content).toContain("chars truncated...") + expect(Buffer.byteLength(content, "utf-8")).toBeGreaterThan(Truncate.MAX_BYTES) + }) + }) +}) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 476e2b3bcfe9..dc59be646387 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index a7d229110b32..37982df2d897 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/src/v2/client.ts b/packages/sdk/js/src/v2/client.ts index 806ad26e55ac..8685be52d6a7 100644 --- a/packages/sdk/js/src/v2/client.ts +++ b/packages/sdk/js/src/v2/client.ts @@ -19,9 +19,11 @@ export function createOpencodeClient(config?: Config & { directory?: string }) { } if (config?.directory) { + const isNonASCII = /[^\x00-\x7F]/.test(config.directory) + const encodedDirectory = isNonASCII ? encodeURIComponent(config.directory) : config.directory config.headers = { ...config.headers, - "x-opencode-directory": config.directory, + "x-opencode-directory": encodedDirectory, } } diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index fa0270f77072..0da7cdfd9224 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1411,6 +1411,10 @@ export type AgentConfig = { */ description?: string mode?: "subagent" | "primary" | "all" + /** + * Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent) + */ + hidden?: boolean options?: { [key: string]: unknown } diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index bf513daf698f..5812c5178d55 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -8364,6 +8364,10 @@ "type": "string", "enum": ["subagent", "primary", "all"] }, + "hidden": { + "description": "Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)", + "type": "boolean" + }, "options": { "type": "object", "propertyNames": { diff --git a/packages/slack/package.json b/packages/slack/package.json index a3f3c81cf11f..6c814010c996 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 2893d6eefd9f..65d8897d8556 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "1.1.4", + "version": "1.1.6", "type": "module", "license": "MIT", "exports": { @@ -44,6 +44,7 @@ "@pierre/diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/bounds": "0.1.3", + "@solid-primitives/media": "2.3.3", "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", "@typescript/native-preview": "catalog:", diff --git a/packages/ui/src/components/diff.tsx b/packages/ui/src/components/diff.tsx index 7620f2bb5e8b..33925592c0f1 100644 --- a/packages/ui/src/components/diff.tsx +++ b/packages/ui/src/components/diff.tsx @@ -1,5 +1,6 @@ import { checksum } from "@opencode-ai/util/encode" import { FileDiff } from "@pierre/diffs" +import { createMediaQuery } from "@solid-primitives/media" import { createEffect, createMemo, onCleanup, splitProps } from "solid-js" import { createDefaultOptions, type DiffProps, styleVariables } from "../pierre" import { getWorkerPool } from "../pierre/worker" @@ -8,10 +9,19 @@ export function Diff(props: DiffProps) { let container!: HTMLDivElement const [local, others] = splitProps(props, ["before", "after", "class", "classList", "annotations"]) - const options = createMemo(() => ({ - ...createDefaultOptions(props.diffStyle), - ...others, - })) + const mobile = createMediaQuery("(max-width: 640px)") + + const options = createMemo(() => { + const opts = { + ...createDefaultOptions(props.diffStyle), + ...others, + } + if (!mobile()) return opts + return { + ...opts, + disableLineNumbers: true, + } + }) let instance: FileDiff | undefined diff --git a/packages/ui/src/hooks/use-filtered-list.tsx b/packages/ui/src/hooks/use-filtered-list.tsx index af94162295d8..d07d10025b1a 100644 --- a/packages/ui/src/hooks/use-filtered-list.tsx +++ b/packages/ui/src/hooks/use-filtered-list.tsx @@ -1,6 +1,6 @@ import fuzzysort from "fuzzysort" import { entries, flatMap, groupBy, map, pipe } from "remeda" -import { createMemo, createResource } from "solid-js" +import { createEffect, createMemo, createResource, on } from "solid-js" import { createStore } from "solid-js/store" import { createList } from "solid-list" @@ -86,9 +86,14 @@ export function useFilteredList(props: FilteredListProps) { } } + createEffect( + on(grouped, () => { + reset() + }), + ) + const onInput = (value: string) => { setStore("filter", value) - reset() } return { diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index b80398e1d968..729ff045a652 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -372,3 +372,17 @@ input:where([type="button"], [type="reset"], [type="submit"]), [hidden]:where(:not([hidden="until-found"])) { display: none !important; } + +/* + Prevent iOS Safari from auto-zooming on input focus. + iOS WebKit zooms on any input with font-size < 16px as an accessibility feature. +*/ + +@media (hover: none) and (pointer: coarse) { + input, + select, + textarea, + [contenteditable="true"] { + font-size: 16px !important; + } +} diff --git a/packages/ui/src/theme/default-themes.ts b/packages/ui/src/theme/default-themes.ts index 749d5e97ccb2..42e94b446d28 100644 --- a/packages/ui/src/theme/default-themes.ts +++ b/packages/ui/src/theme/default-themes.ts @@ -9,6 +9,7 @@ import catppuccinThemeJson from "./themes/catppuccin.json" import ayuThemeJson from "./themes/ayu.json" import oneDarkProThemeJson from "./themes/onedarkpro.json" import shadesOfPurpleThemeJson from "./themes/shadesofpurple.json" +import nightowlThemeJson from "./themes/nightowl.json" export const oc1Theme = oc1ThemeJson as DesktopTheme export const tokyonightTheme = tokyoThemeJson as DesktopTheme @@ -20,6 +21,7 @@ export const catppuccinTheme = catppuccinThemeJson as DesktopTheme export const ayuTheme = ayuThemeJson as DesktopTheme export const oneDarkProTheme = oneDarkProThemeJson as DesktopTheme export const shadesOfPurpleTheme = shadesOfPurpleThemeJson as DesktopTheme +export const nightowlTheme = nightowlThemeJson as DesktopTheme export const DEFAULT_THEMES: Record = { "oc-1": oc1Theme, @@ -32,4 +34,5 @@ export const DEFAULT_THEMES: Record = { ayu: ayuTheme, onedarkpro: oneDarkProTheme, shadesofpurple: shadesOfPurpleTheme, + nightowl: nightowlTheme, } diff --git a/packages/ui/src/theme/index.ts b/packages/ui/src/theme/index.ts index d8e0461be36d..1ec4dc68296f 100644 --- a/packages/ui/src/theme/index.ts +++ b/packages/ui/src/theme/index.ts @@ -41,4 +41,5 @@ export { ayuTheme, oneDarkProTheme, shadesOfPurpleTheme, + nightowlTheme, } from "./default-themes" diff --git a/packages/ui/src/theme/themes/nightowl.json b/packages/ui/src/theme/themes/nightowl.json new file mode 100644 index 000000000000..5b0331e5fd5a --- /dev/null +++ b/packages/ui/src/theme/themes/nightowl.json @@ -0,0 +1,131 @@ +{ + "$schema": "https://opencode.ai/desktop-theme.json", + "name": "Night Owl", + "id": "nightowl", + "light": { + "seeds": { + "neutral": "#f0f0f0", + "primary": "#4876d6", + "success": "#2aa298", + "warning": "#c96765", + "error": "#de3d3b", + "info": "#4876d6", + "interactive": "#4876d6", + "diffAdd": "#2aa298", + "diffDelete": "#de3d3b" + }, + "overrides": { + "background-base": "#fbfbfb", + "background-weak": "#f0f0f0", + "background-strong": "#ffffff", + "background-stronger": "#ffffff", + "border-weak-base": "#d9d9d9", + "border-weak-hover": "#cccccc", + "border-weak-active": "#bfbfbf", + "border-weak-selected": "#4876d6", + "border-weak-disabled": "#e6e6e6", + "border-weak-focus": "#4876d6", + "border-base": "#c0c0c0", + "border-hover": "#b3b3b3", + "border-active": "#a6a6a6", + "border-selected": "#4876d6", + "border-disabled": "#d9d9d9", + "border-focus": "#4876d6", + "border-strong-base": "#90a7b2", + "border-strong-hover": "#7d9aa6", + "border-strong-active": "#6a8d9a", + "border-strong-selected": "#4876d6", + "border-strong-disabled": "#c0c0c0", + "border-strong-focus": "#4876d6", + "surface-diff-add-base": "#eaf8f6", + "surface-diff-delete-base": "#fbe9e9", + "surface-diff-hidden-base": "#e8f0fc", + "text-base": "#403f53", + "text-weak": "#7a8181", + "text-strong": "#1a1a1a", + "syntax-string": "#c96765", + "syntax-primitive": "#aa0982", + "syntax-property": "#4876d6", + "syntax-type": "#994cc3", + "syntax-constant": "#2aa298", + "syntax-info": "#4876d6", + "markdown-heading": "#4876d6", + "markdown-text": "#403f53", + "markdown-link": "#4876d6", + "markdown-link-text": "#2aa298", + "markdown-code": "#2aa298", + "markdown-block-quote": "#7a8181", + "markdown-emph": "#994cc3", + "markdown-strong": "#c96765", + "markdown-horizontal-rule": "#90a7b2", + "markdown-list-item": "#4876d6", + "markdown-list-enumeration": "#2aa298", + "markdown-image": "#4876d6", + "markdown-image-text": "#2aa298", + "markdown-code-block": "#403f53" + } + }, + "dark": { + "seeds": { + "neutral": "#011627", + "primary": "#82aaff", + "success": "#c5e478", + "warning": "#ecc48d", + "error": "#ef5350", + "info": "#82aaff", + "interactive": "#82aaff", + "diffAdd": "#c5e478", + "diffDelete": "#ef5350" + }, + "overrides": { + "background-base": "#011627", + "background-weak": "#0b253a", + "background-strong": "#001122", + "background-stronger": "#000c17", + "border-weak-base": "#1d3b53", + "border-weak-hover": "#234561", + "border-weak-active": "#2a506f", + "border-weak-selected": "#82aaff", + "border-weak-disabled": "#0f2132", + "border-weak-focus": "#82aaff", + "border-base": "#3a5a75", + "border-hover": "#456785", + "border-active": "#507494", + "border-selected": "#82aaff", + "border-disabled": "#1a3347", + "border-focus": "#82aaff", + "border-strong-base": "#5f7e97", + "border-strong-hover": "#6e8da6", + "border-strong-active": "#7d9cb5", + "border-strong-selected": "#82aaff", + "border-strong-disabled": "#2c4a63", + "border-strong-focus": "#82aaff", + "surface-diff-add-base": "#0a2e1a", + "surface-diff-delete-base": "#2d1b1b", + "surface-diff-hidden-base": "#0b253a", + "text-base": "#d6deeb", + "text-weak": "#5f7e97", + "text-strong": "#ffffff", + "syntax-string": "#ecc48d", + "syntax-primitive": "#f78c6c", + "syntax-property": "#82aaff", + "syntax-type": "#c5e478", + "syntax-constant": "#7fdbca", + "syntax-info": "#82aaff", + "markdown-heading": "#82aaff", + "markdown-text": "#d6deeb", + "markdown-link": "#82aaff", + "markdown-link-text": "#7fdbca", + "markdown-code": "#c5e478", + "markdown-block-quote": "#5f7e97", + "markdown-emph": "#c792ea", + "markdown-strong": "#ecc48d", + "markdown-horizontal-rule": "#5f7e97", + "markdown-list-item": "#82aaff", + "markdown-list-enumeration": "#7fdbca", + "markdown-image": "#82aaff", + "markdown-image-text": "#7fdbca", + "markdown-code-block": "#d6deeb" + } + } +} diff --git a/packages/util/package.json b/packages/util/package.json index 5c69ab326dbc..c3b20dd4d70c 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "1.1.4", + "version": "1.1.6", "private": true, "type": "module", "license": "MIT", diff --git a/packages/web/package.json b/packages/web/package.json index 8664035f51a2..ac17c6483190 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@opencode-ai/web", "type": "module", "license": "MIT", - "version": "1.1.4", + "version": "1.1.6", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/packages/web/src/content/docs/agents.mdx b/packages/web/src/content/docs/agents.mdx index 81d150ea4ca5..50d3d39a8739 100644 --- a/packages/web/src/content/docs/agents.mdx +++ b/packages/web/src/content/docs/agents.mdx @@ -511,6 +511,62 @@ The `mode` option can be set to `primary`, `subagent`, or `all`. If no `mode` is --- +### Hidden + +Hide a subagent from the `@` autocomplete menu with `hidden: true`. Useful for internal subagents that should only be invoked programmatically by other agents via the Task tool. + +```json title="opencode.json" +{ + "agent": { + "internal-helper": { + "mode": "subagent", + "hidden": true + } + } +} +``` + +This only affects user visibility in the autocomplete menu. Hidden agents can still be invoked by the model via the Task tool if permissions allow. + +:::note +Only applies to `mode: subagent` agents. +::: + +--- + +### Task permissions + +Control which subagents an agent can invoke via the Task tool with `permission.task`. Uses glob patterns for flexible matching. + +```json title="opencode.json" +{ + "agent": { + "orchestrator": { + "mode": "primary", + "permission": { + "task": { + "*": "deny", + "orchestrator-*": "allow", + "code-reviewer": "ask" + } + } + } + } +} +``` + +When set to `deny`, the subagent is removed from the Task tool description entirely, so the model won't attempt to invoke it. + +:::tip +Rules are evaluated in order, and the **last matching rule wins**. In the example above, `orchestrator-planner` matches both `*` (deny) and `orchestrator-*` (allow), but since `orchestrator-*` comes after `*`, the result is `allow`. +::: + +:::tip +Users can always invoke any subagent directly via the `@` autocomplete menu, even if the agent's task permissions would deny it. +::: + +--- + ### Additional Any other options you specify in your agent configuration will be **passed through directly** to the provider as model options. This allows you to use provider-specific features and parameters. diff --git a/packages/web/src/content/docs/keybinds.mdx b/packages/web/src/content/docs/keybinds.mdx index d7ac002d45ca..267d194c099d 100644 --- a/packages/web/src/content/docs/keybinds.mdx +++ b/packages/web/src/content/docs/keybinds.mdx @@ -144,7 +144,6 @@ The OpenCode desktop app prompt input supports common Readline/Emacs-style short | `ctrl+u` | Kill to start of line | | `ctrl+w` | Kill previous word | | `alt+d` | Kill next word | -| `ctrl+y` | Yank (paste) last killed text | | `ctrl+t` | Transpose characters | | `ctrl+g` | Cancel popovers / abort running response | diff --git a/script/sync/fork-features.json b/script/sync/fork-features.json index 2eecfe8d5bc4..2987f8b8ed78 100644 --- a/script/sync/fork-features.json +++ b/script/sync/fork-features.json @@ -1,9 +1,9 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "description": "Fork-specific features from upstream PRs that must be preserved during merges", - "lastUpdated": "2026-01-04", - "lastChange": "v1.1.1 merge: Abandoned glob-permissions (ariane-emory) in favor of upstream PermissionNext. Abandoned fork worktree ID support for upstream sandboxes. Kept AskQuestion tool.", - "note": "v1.1.1 introduces upstream worktree/sandbox support and PermissionNext with Wildcard pattern matching", + "lastUpdated": "2026-01-07", + "lastChange": "Cherry-picked PR #5432: Stream ripgrep output in grep tool to prevent memory exhaustion. Also added spinner support for all running tool calls.", + "note": "v1.1.6 sync. Fork includes streaming grep optimization, spinner for all tool calls, and critical PWA/SDK fixes.", "forkDependencies": { "description": "NPM dependencies added by fork features that MUST be preserved during package.json merges. These are frequently lost when accepting upstream version bumps.", "packages/opencode/package.json": [ @@ -192,7 +192,7 @@ "title": "AskQuestion tool for user input", "author": "iljod", "status": "open", - "description": "Interactive tool that allows AI to pause and solicit structured feedback via TUI/web wizard with single/multi-select and confirm dialogs. Fixes race conditions from PR 5563. Disabled by default - enable with experimental.askquestion_tool config.", + "description": "Interactive tool that allows AI to pause and solicit structured feedback via TUI/web wizard with single/multi-select and confirm dialogs. Fixes race conditions from PR 5563. Disabled by default - enable with experimental.askquestion_tool config. v1.1.4 improvements: callID validation, fallback scan detection for delayed messages, getMetadata/findInParts helpers.", "experimentalConfig": "askquestion_tool", "files": [ "packages/opencode/src/askquestion/index.ts", @@ -205,7 +205,9 @@ "packages/opencode/src/config/config.ts", "packages/opencode/src/tool/registry.ts", "packages/app/src/components/askquestion-wizard.tsx", - "packages/app/src/pages/session.tsx" + "packages/app/src/pages/session.tsx", + "packages/opencode/test/server/askquestion.test.ts", + "packages/opencode/test/tool/askquestion.test.ts" ], "criticalCode": [ { @@ -215,8 +217,8 @@ }, { "file": "packages/opencode/src/tool/askquestion.ts", - "description": "Tool definition with Zod schema for 1-6 questions", - "markers": ["AskQuestionTool", "questions.min(1).max(6)"] + "description": "Tool definition with Zod schema for 1-6 questions and callID validation", + "markers": ["AskQuestionTool", "questions.min(1).max(6)", "if (!callID)", "ctx.callID"] }, { "file": "packages/opencode/src/cli/cmd/tui/ui/dialog-askquestion.tsx", @@ -225,8 +227,8 @@ }, { "file": "packages/opencode/src/cli/cmd/tui/routes/session/index.tsx", - "description": "Detection of pending askquestion tools and rendering of dialog", - "markers": ["pendingAskQuestionFromSync", "DialogAskQuestion"] + "description": "Detection of pending askquestion with callID guard and fallback scan", + "markers": ["pendingAskQuestionFromSync", "DialogAskQuestion", "if (!toolPart.callID) continue", "getMetadata", "findInParts"] }, { "file": "packages/opencode/src/server/server.ts", @@ -250,8 +252,8 @@ }, { "file": "packages/app/src/pages/session.tsx", - "description": "Web app detection of pending askquestion and wizard rendering", - "markers": ["pendingAskQuestion", "AskQuestionWizard", "handleAskQuestionSubmit", "handleAskQuestionCancel"] + "description": "Web app detection with callID guard and fallback scan for delayed messages", + "markers": ["pendingAskQuestion", "AskQuestionWizard", "if (!toolPart.callID) continue", "getMetadata", "findInParts"] } ] }, @@ -445,13 +447,13 @@ "title": "Toggle transparent background", "author": "JosXa", "status": "open", - "description": "Command palette toggle for transparent TUI background, works with any theme", + "description": "Command palette toggle for transparent TUI background, works with any theme. v1.1.4 fix: normalizeBackgrounds() ensures opaque fallbacks for transparent themes (like lucent-orng) when toggle is off.", "files": ["packages/opencode/src/cli/cmd/tui/app.tsx", "packages/opencode/src/cli/cmd/tui/context/theme.tsx"], "criticalCode": [ { "file": "packages/opencode/src/cli/cmd/tui/context/theme.tsx", - "description": "Transparent state in Theme context and resolveTheme function", - "markers": ["transparent", "setTransparent", "resolveTheme"] + "description": "Transparent state, resolveTheme, and normalizeBackgrounds for opaque fallbacks", + "markers": ["transparent", "setTransparent", "resolveTheme", "normalizeBackgrounds"] }, { "file": "packages/opencode/src/cli/cmd/tui/app.tsx", @@ -1624,6 +1626,181 @@ "markers": ["input_paste:", "ctrl+v,ctrl+shift+v"] } ] + }, + { + "pr": 0, + "title": "iOS PWA viewport locking to prevent overscroll bounce", + "author": "fork", + "status": "fork-only", + "description": "Lock viewport on iOS PWA to prevent rubber-banding/overscroll bounce. Uses position:fixed on html/body/root, overscroll-behavior:none, and -webkit-overflow-scrolling for scroll containers.", + "files": [ + "packages/app/src/index.css", + "packages/app/src/components/pull-to-refresh.tsx", + "packages/app/src/pages/layout.tsx" + ], + "criticalCode": [ + { + "file": "packages/app/src/index.css", + "description": "PWA standalone mode viewport locking rules", + "markers": ["@media (display-mode: standalone)", "position: fixed", "overscroll-behavior: none", "-webkit-overflow-scrolling: touch"] + }, + { + "file": "packages/app/src/index.css", + "description": "Session scroll container with contained overscroll", + "markers": [".session-scroll-container", "overscroll-behavior: contain"] + }, + { + "file": "packages/app/src/components/pull-to-refresh.tsx", + "description": "Enabled prop to disable pull-to-refresh in PWA mode", + "markers": ["enabled", "props.enabled"] + }, + { + "file": "packages/app/src/pages/layout.tsx", + "description": "Pass enabled={!isPWA()} to PullToRefresh component", + "markers": ["isPWA()", "enabled={!isPWA()}"] + } + ] + }, + { + "pr": 0, + "title": "Bedrock bundled AWS SDK export shape fix", + "author": "fork", + "status": "fork-only", + "description": "Handle Bun's bundled export shapes for AWS SDK credential providers. When shuvcode bundles via Bun.build(), the export structure changes from direct named exports to nested default wrappers.", + "files": [ + "packages/opencode/src/provider/provider.ts", + "packages/opencode/test/provider/bedrock.test.ts" + ], + "criticalCode": [ + { + "file": "packages/opencode/src/provider/provider.ts", + "description": "loadCredentialProvider helper with bundled/unbundled export handling", + "markers": [ + "loadCredentialProvider", + "awsSdkModule.fromNodeProviderChain", + "awsSdkModule.default?.fromNodeProviderChain", + "awsSdkModule.default?.default?.fromNodeProviderChain" + ] + } + ] + }, + { + "pr": 0, + "title": "Plugin asset bundling with audio support", + "author": "fork", + "status": "fork-only", + "description": "Unified plugin asset bundling utility that copies static assets (including audio files) while preserving directory structure. Includes symlink/path traversal security checks.", + "files": [ + "packages/opencode/src/util/asset-copy.ts", + "packages/opencode/src/bun/index.ts", + "packages/opencode/src/plugin/index.ts", + "packages/opencode/test/asset-copy.test.ts" + ], + "criticalCode": [ + { + "file": "packages/opencode/src/util/asset-copy.ts", + "description": "ASSET_EXTENSIONS constant with audio formats", + "markers": ["ASSET_EXTENSIONS", ".wav", ".mp3", ".ogg", ".flac", ".m4a", ".aac"] + }, + { + "file": "packages/opencode/src/util/asset-copy.ts", + "description": "copyPluginAssets function with directory structure preservation", + "markers": ["copyPluginAssets", "realpath", "lstat", "isSymbolicLink"] + }, + { + "file": "packages/opencode/src/util/asset-copy.ts", + "description": "resolvePluginRoot to find nearest package.json", + "markers": ["resolvePluginRoot", "package.json"] + } + ] + }, + { + "pr": 0, + "title": "TUI bash spinner reactivity fix", + "author": "fork", + "status": "fork-only", + "description": "Fix TUI bash spinner not stopping after command completion. Changed isRunning from non-reactive constant to createMemo for proper reactivity.", + "files": ["packages/opencode/src/cli/cmd/tui/routes/session/index.tsx"], + "criticalCode": [ + { + "file": "packages/opencode/src/cli/cmd/tui/routes/session/index.tsx", + "description": "Bash component uses createMemo for isRunning state", + "markers": ["createMemo", "isRunning", "props.part.state.status"] + } + ] + }, + { + "pr": 0, + "title": "TUI transparency normalization fix", + "author": "fork", + "status": "fork-only", + "description": "Fix transparent themes (like lucent-orng) showing invisible backgrounds when transparency toggle is off. normalizeBackgrounds() ensures opaque fallbacks for background colors.", + "files": ["packages/opencode/src/cli/cmd/tui/context/theme.tsx"], + "criticalCode": [ + { + "file": "packages/opencode/src/cli/cmd/tui/context/theme.tsx", + "description": "normalizeBackgrounds function with fallback chain", + "markers": ["normalizeBackgrounds", "backgroundMenu", "backgroundElement", "backgroundPanel"] + } + ] + }, + { + "pr": 0, + "title": "Session metadata preservation during streaming", + "author": "fork", + "status": "fork-only", + "description": "Fix metadata being lost during tool-call stream events. Preserves time.start in ctx.metadata and adds running guard to prevent status regression.", + "files": [ + "packages/opencode/src/session/prompt.ts", + "packages/opencode/src/session/message-v2.ts" + ], + "criticalCode": [ + { + "file": "packages/opencode/src/session/prompt.ts", + "description": "Preserve time.start in ctx.metadata updates", + "markers": ["time.start", "ctx.metadata"] + }, + { + "file": "packages/opencode/src/session/message-v2.ts", + "description": "Running guard to prevent completed/error -> running regression", + "markers": ["status", "running", "completed", "error"] + } + ] + }, + { + "pr": 0, + "title": "TUI spinner for running tool calls and subagent tasks", + "author": "fork", + "status": "fork-only", + "description": "Show custom spinner animation for all running tool calls (not just bash) including subagent tasks. Extends InlineTool and BlockTool components to display spinner when tool state is 'running'.", + "files": ["packages/opencode/src/cli/cmd/tui/routes/session/index.tsx"], + "criticalCode": [ + { + "file": "packages/opencode/src/cli/cmd/tui/routes/session/index.tsx", + "description": "InlineTool component shows spinner when isRunning() is true", + "markers": ["isRunning", "getSpinnerFrame", "Show when={isRunning()}", "theme.primary"] + }, + { + "file": "packages/opencode/src/cli/cmd/tui/routes/session/index.tsx", + "description": "BlockTool component shows spinner next to title when running", + "markers": ["isRunning", "getSpinnerFrame", "Show when={isRunning()}", "theme.primary"] + } + ] + }, + { + "pr": 5432, + "title": "Stream ripgrep output to prevent memory exhaustion", + "author": "Hona", + "status": "cherry-picked", + "description": "Stream ripgrep output line-by-line instead of buffering all into memory. Kills ripgrep early after 100 matches to prevent memory exhaustion on massive result sets. Removes per-file stat() calls for performance.", + "files": ["packages/opencode/src/tool/grep.ts"], + "criticalCode": [ + { + "file": "packages/opencode/src/tool/grep.ts", + "description": "Stream ripgrep stdout with ReadableStream reader and early termination", + "markers": ["MATCH_LIMIT", "reader.read()", "proc.kill()", "truncated"] + } + ] } ] } diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index da3f6cce6d34..caa6c3b13185 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,8 +2,8 @@ "name": "shuvcode", "displayName": "shuvcode", "description": "shuvcode for VS Code", - "version": "1.1.4", - "publisher": "latitudes-dev" + "version": "1.1.6", + "publisher": "latitudes-dev", "repository": { "type": "git", "url": "https://github.com/anomalyco/opencode" diff --git a/sst-env.d.ts b/sst-env.d.ts index 18e2d40d657d..6e8b8e67e6a3 100644 --- a/sst-env.d.ts +++ b/sst-env.d.ts @@ -124,6 +124,10 @@ declare module "sst" { "type": "sst.cloudflare.StaticSite" "url": string } + "ZEN_BLACK": { + "type": "sst.sst.Secret" + "value": string + } "ZEN_MODELS1": { "type": "sst.sst.Secret" "value": string